当前位置:  开发笔记 > 编程语言 > 正文

如何在Rx Observable上"等待"?

如何解决《如何在RxObservable上"等待"?》经验,为你挑选了3个好方法。

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

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

天真的尝试会导致等待立即解决而不会阻止执行

编辑:我的完整用途的伪代码是:

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

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



1> Macil..:

你必须通过承诺await.将observable的下一个事件转换为promise并等待它.

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

编辑注释:这个答案最初使用.take(1)但更改为使用.first(),这避免了如果流在值到来之前结束,Promise永远不会解决的问题.


@apricity如果完成时没有值,`first()`将导致拒绝,`take(1)`将导致未决的承诺.
现在不推荐使用toPromise(),我们应该怎么做?
@apricity @AgentME实际上你不应该在这种情况下使用`take(1)`或`first()`.由于您期望恰好发生一个事件,因此您应该使用`single()`,如果超过1则抛出异常,而在没有异常时抛出异常.如果存在多个,则代码/数据模型中可能存在错误.如果您不使用单个,则最终会随意选择返回的第一个项目,而不会发出警告.您必须注意上游数据源中的谓词,以始终保持相同的顺序.
你可以使用`await observable.first().toPromise();而不是take(1).
不要忘记导入:`import'rxjs/add/operator/first';`
@ Jus10我找不到任何东西来表明`toPromise()`已被弃用。你在哪里读的?

2> Estus Flask..:

它一定要是

await observable.first().toPromise();

正如之前的评论中所指出的那样,当存在空的完整观察值时take(1),first()运算符与运算符之间存在很大差异.

Observable.empty().first().toPromise()将导致拒绝,EmptyError因此可以相应地处理,这通常是理想的行为.

并且Observable.empty().take(1).toPromise()将导致未决的承诺,这是可取的......几乎从不.



3> Josh Durham..:

你需要await一个承诺,所以你会想要使用toPromise().见这对更多的细节toPromise().

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有