2017-04-11 104 views
8

我正在從承諾世界走向可觀察世界。我通常對Promise做的一件事是鏈接一系列任務,並讓它們按順序運行。例如,我有三個任務:printLog1()打印1到控制檯,printLog23()打印2和3到控制檯,並printLog4()打印4如何強制observables按順序執行?

當我想打印1-2-3-4,我會寫一個承諾鏈狀

printLog1() 
    .then(() => { 
    printLog23(); 
    }) 
    .then(() => { 
    printLog4(); 
    }); 

現在我想用可觀測相同的功能,我可以重寫printLog()功能爲可觀察到的一樣

printLog1 = Rx.Observabale.of(1).map((i) => console.log(i)); 
printLog23 = Rx.Observabale.of(2, 3).map((i) => console.log(i)); 
printLog4 = Rx.Observabale.of(4).map((i) => console.log(i)); 

然後我有三個觀測發射不同VA指向控制檯。我如何鏈接它們以便這三個觀察對象順序運行並打印1-2-3-4

回答

11

如果要確定排放順序與您指定源Obserbles的順序相同,可以使用concatconcatMap運算符。

concat*運營商只有在先前的Observable完成後纔會訂閱Observable(它也適用於Promises,請參閱http://reactivex.io/rxjs/class/es6/MiscJSDoc.js~ObservableInputDoc.html)。

在你區分它會看起來如下:

Observable.concat(printLog1, printLog23, printLog4); 

...或concatMap如果一個無極的要求取決於從先前的承諾響應:

printLog1 
    .concatMap(response => ...) 
    .concatMap(response => ...); 

...或者當訂單無關緊要時,您可以使用merge立即訂閱所有Observables/Promises,並在到達時重新發送結果:

Observable.merge(printLog1, printLog23, printLog4); 
+0

謝謝您提醒concat操作員。 –