如何在 Rx 可观察量上“等待”?

2022-08-30 02:05:04

我希望能够在可观察物上等待,例如

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

幼稚的尝试会导致等待立即解决,而不会阻止执行

编辑:我的完整预期用例的伪代码是:

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

我知道我可以将其他代码移动到另一个单独的函数中,并将其传递到订阅回调中,但我希望能够避免这种情况。


答案 1

你必须把承诺传递给 .将可观察量的下一个事件转换为承诺并等待。await

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

编辑说明:此答案最初使用.take(1),但已更改为使用.first(),这避免了如果流在值通过之前结束,则承诺永远不会解决的问题。

从 RxJS v8 开始,将被删除。相反,上述内容可以替换为toPromiseawait firstValueFrom(observable)


答案 2

使用新的 或 代替 ,如这里所指出的,从 RxJS 7 开始不推荐使用,并将在 RxJS 8 中删除。firstValueFrom()lastValueFrom()toPromise()

import { firstValueFrom} from 'rxjs';
import { lastValueFrom } from 'rxjs';

this.myProp = await firstValueFrom(myObservable$);
this.myProp = await lastValueFrom(myObservable$);

这在 RxJS 7+ 中可用

请参见: https://indepth.dev/rxjs-heads-up-topromise-is-being-deprecated/