web-dev-qa-db-ja.com

オブザーバブルを強制的に順番に実行する方法は?

私は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_を出力するようにそれらをチェーンするにはどうすればよいですか?

24
Haoliang Yu

放出の順序がソース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用に更新

37
martin