2017-01-01 107 views
4

我有一個對象集合,稱它們爲obj。他們有一個act()方法。 act()方法將最終導致在o上可見的event()調用onComplete鏈條觀察對象

什麼是鏈接這些的好方法?

也就是說,撥打o.act(),等待o.event().onComplete,然後呼叫下一個o2.act(),等在集合o不定。

所以它的簽名是像這樣:

public class Item { 
    final protected PublishSubject<Object> event = PublishSubject.create(); 

    public Observable<ReturnType> event() { 
     return event; 
    } 

    public void act() { 
     // do a bunch of stuff 
     event.onComplete(); 
    } 
} 

然後在消費代碼:

Collection<Item> items... 
foreach item in items 
    item.act -> await item.event().onComplete() -> call next item.act() -> so on 
+0

你需要在o2.act()中返回o.act()嗎?如果不是,你可以異步運行所有這些嗎? – Sebas

+0

@Sebas o2,o3等每個可能取決於上一次執行的副作用(但不是實際返回值) – mtyson

+0

因此,順序問題,是否正確? – Sebas

回答

2

如果我理解正確的話,你的對象有這樣的簽名:

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使用的起。

+0

這是非常接近的,抱歉的細節。我使用Item類更新了這個問題。謝謝 – mtyson

+0

所以你想通過調用第一個'act'來完成它? – weston

+0

的確如此,是的! – mtyson