2017-04-11 8 views
8

私はプロミスの世界から観測可能な世界に移りつつあります。 Promiseで私が通常行うことの1つは、一連のタスクを連鎖させて順番に実行させることです。例えば、私は3つのタスクがあります:私は1-2-3-4を印刷したいときは4observablesを順番に実行するにはどうすればいいですか?

を印刷するには、コンソールに2と3を印刷するコンソールに1を印刷するprintLog1()printLog23()、およびprintLog4()を、Iその後、私は別のVAを発する3つの観測を持っている今、私が観察して同じ機能をしたいと私は

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)); 

のように観察可能にprintLog()機能を書き換えることができ

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

のような約束チェーンを記述しますコンソールに向かっています。これら3つのオブザーバブルが順番に実行され、1-2-3-4が印刷されるように、どうすればチェーン化できますか?

答えて

11

排出量の順序がソースオブザーバブルを指定した順序と同じであることを確認したい場合は、concatまたはconcatMapの演算子を使用できます。

concat*オペレータは、Observableが前のObservableが完了した後でのみ購読します(Promisesも同様に動作します)。http://reactivex.io/rxjs/class/es6/MiscJSDoc.js~ObservableInputDoc.htmlを参照してください。

あなたはそれがどのように見えるだろう場合は、以下:

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

Observable.concat(printLog1, printLog23, printLog4); 

...または1つの約束のための要求は、前の約束からの応答に依存している場合concatMapで...または注文が関係ない場合は、すぐにObservables/Promisesをすべて購読して、結果が到着したときに再利用するmergeを使用できます。

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

私に連鎖演算子を思い出させていただきありがとうございます。 –

関連する問題