web-dev-qa-db-ja.com

Rx Observableで「待機」するにはどうすればよいですか?

私は、観測可能なものを待ち望んでいます。

const source = Rx.Observable.create(/* ... */)
//...
await source;

素朴な試みの結果、待機はすぐに解決され、実行はブロックされません。

編集:私の完全なユースケースの擬似コードは次のとおりです。

if (condition) {
  await observable;
}
// a bunch of other code

他のコードを別の別の関数に移動してサブスクライブコールバックに渡すことができることを理解していますが、それを回避できることを望んでいます。

76
CheapSteaks

awaitに約束を渡す必要があります。オブザーバブルの次のイベントを約束に変換し、それを待ちます。

if (condition) {
  await observable.first().toPromise();
}

注を編集:この回答はもともと.take(1)を使用していましたが、値が到達する前にストリームが終了した場合にPromiseが解決しない問題を回避する.first()を使用するように変更されました

95
Macil

でなければならない

await observable.first().toPromise();

前のコメントで述べたように、空の完全なオブザーバブルが存在する場合、take(1)演算子とfirst()演算子の間にはかなりの違いがあります。

Observable.empty().first().toPromise()は、 EmptyError で拒否され、それに応じて処理できます。これは一般に望ましい動作です。

Observable.empty().take(1).toPromise()は、保留中の約束をもたらしますが、これは望ましいことです。ほとんどありません。

23
Estus Flask

await約束が必要なので、toPromise()を使用する必要があります。 toPromise()の詳細については、 this を参照してください。

8
Josh Durham