158

オブザーバブルを待機できるようにしたい、例えば

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

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

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

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

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

4

7 に答える 7

184

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

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

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

RxJS v8 の時点で、toPromise削除されます。代わりに、上記を次のように置き換えることができますawait firstValueFrom(observable)

于 2015-12-09T23:25:10.763 に答える
12

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

于 2015-12-09T23:52:55.867 に答える
0

RxJS V 6.4.0 を使用しているため、V 7.xx で非推奨のものを使用する必要がありますtoPromise()。他の答えに触発されて、これが私がやったことですtoPromise()

import { first, ... } from 'rxjs/operators';

...

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

...

last()内でどのように使用したかに注意してくださいpipe()。私の場合は、 macilobservable.first()が述べたように機能しないためです。

これが、私と同じようにRxJS V 6.xxを使用している他の人に役立つことを願っています:)。

ありがとう。

于 2021-12-19T07:11:58.963 に答える