我如何在Rx Observable上“等待”?
我希望能够等待一个可观察的,例如
const source = Rx.Observable.create(/* ... */)
//...
await source;
天真的尝试导致等待立即解决并且不阻止执行
编辑:我的完整意向用例的伪代码是:
if (condition) {
await observable;
}
// a bunch of other code
我知道我可以将其他代码移动到另一个单独的函数中,并将它传递给订阅回调函数,但我希望能够避免这种情况。
你必须通过承诺await
。 将observable的下一个事件转换为promise并等待。
if (condition) {
await observable.first().toPromise();
}
编辑注意:此答案最初用于.take(1),但更改为使用.first(),它避免了Promise的问题,如果流在值出现之前结束,则不会解析该问题。
它一定要是
await observable.first().toPromise();
正如之前的评论中指出的那样,当take(1)
和first()
操作符存在空的完成观察值时,会有很大差异。
Observable.empty().first().toPromise()
会导致EmptyError
被拒绝,这可以被相应地处理,这通常是一个理想的行为。
和Observable.empty().take(1).toPromise()
会导致未决的承诺,这是可取的...几乎从不。
你将需要await
一个承诺,所以你会想使用toPromise()
。 有关toPromise()
更多详细信息,请参阅toPromise()
。