RxJS等待承诺解决
RxJS wait until promise resolved
我仍在研究反应式编程,所以我确信这是非常基本的,但流转换的数量对初学者来说是非常巨大的。
我正在从DOM事件创建一个Observable。此事件应依次触发REST调用,并且在解决此事件之前,将忽略所有其他DOM事件。
const stream = Observable.fromEvent(document, 'some-event')
stream
.flatMap(() => httpRestService())
.subscribe(() => {
})
如何忽略流中的事件,直到最后一个HTTP承诺得到解决?
DOM event
A - - - - B - - - - C
HTTP event
D ...........done - C
您可以尝试flatMapFirst
,它似乎可以随心所欲。以下代码可以工作(jsfiddle在这里-点击任何地方):
const stream = Observable.fromEvent(document, 'some-event')
stream
.flatMapFirst(() => httpRestService())
.subscribe(() => {
})
引用文件:
flatMapFirst操作符类似于上面描述的flatMap和concatMap方法,但是,flatMapFirst不是发出由操作符通过转换源Observable中的项生成的所有Observable发出的所有项,而是独占地传播第一个Observable,直到它完成后才开始订阅下一个Observable当前Observable完成之前的Observable将被丢弃,并且不会传播
更新
查看源代码(https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/switchfirst.js)看起来,当当前的可观测值尚未完成时,在此期间所有传入的可观测量都将被丢弃,即不订阅。
因此,如果订阅这些可观察性触发了http调用(很有兴趣查看httpRestService
的代码),那么就没有不必要的http调用。如果这些调用是通过调用函数立即触发的,并且结果通过可观察到的传递,那么这些调用确实有可能被不必要地触发。在这种情况下,只需在订阅时使用defer
运算符进行http调用,就可以很容易地解决这个问题。简而言之,如果您还没有rest请求,则需要延迟执行它。
- 如何在解决承诺之前和之后验证值
- EmberJS:在成功处理请求时解决承诺
- 蓝鸟没有正确解决承诺
- 使用 $http.post 和 res.redirect,而不解决承诺
- 如何在解决承诺后从承诺对象获取值
- 在解决承诺 AngularJS/ES6 后检索存储在服务中的数据
- CSV 完成读取后,如何解决承诺
- 茉莉花间谍和解决承诺
- 如何在轮询时不断解决Q承诺
- 拒绝并解决Q承诺
- 基于另一个承诺解决承诺
- 立即解决承诺
- 通过离子/ui路由解决承诺
- 我可以选择只在if语句的一部分中解决承诺吗
- 开玩笑-在测试前解决承诺
- 多次解决承诺
- 让双方都期待解决承诺
- 问美元.所有这些都在解决承诺之前被调用
- 在angular中解决承诺
- Angularjs单元测试解决承诺