我希望能够等待一个可观察的,例如
const source = Rx.Observable.create(/* ... */) //... await source;
天真的尝试会导致等待立即解决而不会阻止执行
编辑:我的完整用途的伪代码是:
if (condition) { await observable; } // a bunch of other code
我知道我可以将其他代码移动到另一个单独的函数并将其传递给subscribe回调,但我希望能够避免这种情况.
你必须通过承诺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()
.