2017-04-11 107 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操作员。 –