如果我理解正確的話,你的對象有這樣的簽名:
public class Item {
public Observable<ReturnType> event()...
public ReturnType act()...
}
所以,如果他們這樣填寫:
public class Item {
private final String data;
private final Observable<ReturnType> event;
public Item(String data) {
this.data = data;
event = Observable
.fromCallable(this::act);
}
public Observable<ReturnType> event() {
return event;
}
public ReturnType act() {
System.out.println("Item.act: " + data);
return new ReturnType();
}
}
然後他們可以被捆綁,像這樣:
Item item1 = new Item("a");
Item item2 = new Item("b");
Item item3 = new Item("c");
item1.event()
.concatWith(item2.event())
.concatWith(item3.event())
.subscribe();
結果:
Item.act: a
Item.act: b
Item.act: c
然後,如果你有一個Iterable
集合,你可以使用flatMap
:
Iterable<Item> items = Arrays.asList(item1, item2, item3);
Observable.from(items)
.flatMap(Item::event)
.subscribe();
替代
這更像是你的情況可能是另一種:
public class Item {
private final PublishSubject<Void> event = PublishSubject.create();
private final String data;
public Item(String data) {
this.data = data;
}
public Observable<Void> event() {
return event;
}
public Void act() {
System.out.println("Item.act: " + data);
// do a bunch of stuff
event.onCompleted();
return null;
}
}
用法:
Iterable<Item> iterable = Arrays.asList(item2, item3);
item1.event().
concatWith(Observable.from(iterable)
.map(Item::act))
.subscribe();
item1.act();
但它不event()
上的項目2使用的起。
你需要在o2.act()中返回o.act()嗎?如果不是,你可以異步運行所有這些嗎? – Sebas
@Sebas o2,o3等每個可能取決於上一次執行的副作用(但不是實際返回值) – mtyson
因此,順序問題,是否正確? – Sebas