簡體   English   中英

RXJava 順序執行 observable

[英]RXJava Sequentially execute observable

我有多個返回Observable<String>的函數。 每個 function 對文件系統執行命令。 我需要一個接一個地執行每個 function 並在 observable 中得到 function 的 output。 最后,我想要一個Observable<String> ,其中包含按函數調用順序排列的所有函數的 output

單獨地,每個 function 都按預期工作,但我需要正確合並 output。

我試過 Observable.concatArray(func1, func2, ... ) 像這樣:

    return Observable.concatArray(
        func1(),
        func2(),
        func3(), 
        func4()
    );

但這只是保留了 observable 事件的順序。 不是函數的順序。 我的意思是如果 func1 發出事件 A 和 A',而 func2 發出 B 和 B',我將有 A->A'->B->B'。 但是 func2 會在 func1 之后立即啟動。 這導致我的問題是 func1 需要在 func2 啟動之前完成。

第一個 function 通過 maven 在文件系統上生成目錄。 所以,一個長期的任務。 第二,在這個目錄中寫入一個文件。 但是 concatArray 在第一個之后立即啟動第二個。 並且命令失敗,因為此時該目錄不存在。

有沒有辦法避免像這樣丑陋的事情:

Subject<String> result = PublishSubject.create();
Observable<String> func1Obs = funct1(); 
Observable<String> func2Obs = funct2(); 

func1Obs.subscribe(output -> result.onNext(output));
func1Obs.onDoComplete(() -> {
    func2Obs.subscribe(output -> result.onNext(output);
}
return result;

作為 Suggest Progman,錯誤與 concatArray 無關,這是要使用的方法。 問題是,在我的 function 列表中,我使用的是這種代碼:

public Observable<String> func1() {
    Subject<String> result = PublishSubject.create();
    String output = dosomething()
    result.onNext(output);
}

這里的問題是 function doSomething() 在您創建 observable 時立即調用。

如果需要 onNext、onComplete 等,解決方案是使用Observable.create()中的任何一個...:

public Observable<String> func1() {
    // See how we wrap our instruction inside create method
    return Observable.create( result -> {
        String output = dosomething()
        result.onNext(output);   
    });
}

Observable.defer() ,如果您只需要等待訂閱:

public Observable<String> func1() {
    // See how we wrap our instruction inside create method
    return Observable.defer( () -> dosomething());
}

之后,您可以致電:

return Observable.concatArray(
    func1(),
    func2(),
    func3(), 
    func4()
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM