关于javascript:如何在Rx Observable上“等待”?

How can I `await` on an Rx Observable?

我希望能够等待一个可观测的,例如

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

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

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

1
2
3
4
if (condition) {
  await observable;
}
// a bunch of other code

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


你必须向await承诺。把观察到的下一个事件转化为承诺,然后等待。

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

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


必须是

1
await observable.first().toPromise();

正如之前的评论中所指出的,当可观测到空的完整数据时,take(1)first()运算符之间存在实质性差异。

Observable.empty().first().toPromise()将导致可以相应处理的EmptyError的拒绝,这通常是一种可取的行为。

Observable.empty().take(1).toPromise()将导致未决承诺,这是可取的……几乎从来没有。


你需要await一个承诺,所以你需要使用toPromise()。有关toPromise()的更多详细信息,请参阅此部分。