私は、観測可能なものを待ち望んでいます。
const source = Rx.Observable.create(/* ... */)
//...
await source;
素朴な試みの結果、待機はすぐに解決され、実行はブロックされません。
編集:私の完全なユースケースの擬似コードは次のとおりです。
if (condition) {
await observable;
}
// a bunch of other code
他のコードを別の別の関数に移動してサブスクライブコールバックに渡すことができることを理解していますが、それを回避できることを望んでいます。
await
に約束を渡す必要があります。オブザーバブルの次のイベントを約束に変換し、それを待ちます。
if (condition) {
await observable.first().toPromise();
}
注を編集:この回答はもともと.take(1)を使用していましたが、値が到達する前にストリームが終了した場合にPromiseが解決しない問題を回避する.first()を使用するように変更されました
でなければならない
await observable.first().toPromise();
前のコメントで述べたように、空の完全なオブザーバブルが存在する場合、take(1)
演算子とfirst()
演算子の間にはかなりの違いがあります。
Observable.empty().first().toPromise()
は、 EmptyError
で拒否され、それに応じて処理できます。これは一般に望ましい動作です。
Observable.empty().take(1).toPromise()
は、保留中の約束をもたらしますが、これは望ましいことです。ほとんどありません。
await
約束が必要なので、toPromise()
を使用する必要があります。 toPromise()
の詳細については、 this を参照してください。