私はPromiseの世界からObservableの世界に移行しています。私がPromiseで通常行うことの1つは、一連のタスクをチェーン化し、それらを順番に実行することです。たとえば、3つのタスクがあります。1をコンソールに印刷するprintLog1()
、2と3をコンソールに印刷するprintLog23()
、4を印刷するprintLog4()
です。
1-2-3-4を印刷したいときは、次のようなプロミスチェーンを書きます。
_printLog1()
.then(() => {
printLog23();
})
.then(() => {
printLog4();
});
_
これで、Observableで同じ機能が必要になり、printLog()
関数をObservableに書き換えることができます。
_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));
_
次に、コンソールに異なる値を出力する3つのオブザーバブルがあります。これらの3つのオブザーバブルが順番に実行され、_1-2-3-4
_を出力するようにそれらをチェーンするにはどうすればよいですか?
放出の順序がソースObservablesを指定した順序と同じであることを確認する場合は、concat
またはconcatMap
演算子を使用できます。
concat*
演算子は、以前のObservableが完了した後にのみObservableにサブスクライブします(Promisesでも動作します。 http://reactivex.io/rxjs/class/es6/MiscJSDoc.js~ObservableInputDoc.html を参照してください) )。
あなたの場合、次のようになります:
import { concat } from 'rxjs'; // Note, concat from 'rxjs', is not the same as concat from 'rxjs/operators'
concat(printLog1, printLog23, printLog4);
...または、1つのPromiseに対する要求が前のPromiseからの応答に依存する場合は、concatMap
を使用します。
printLog1.pipe(
concatMap(response => ...),
concatMap(response => ...),
);
...または、順序が重要でない場合は、merge
を使用して、すべてのObservables/Promiseをすぐにサブスクライブし、到着した結果を再送信できます。
merge(printLog1, printLog23, printLog4);
2019年1月:RxJS 6用に更新