Jac*_*Guy 3 javascript reactive-programming rxjs
我仍在计算反应式编程,所以我很确定这是非常基本的,但是对于初学者来说,流转换的数量非常大.
我正在从DOM事件创建一个Observable.此事件应依次触发REST调用,并且在解决此事件之前,将忽略所有其他DOM事件.
const stream = Observable.fromEvent(document, 'some-event')
stream
.flatMap(() => httpRestService())
.subscribe(() => {
})
Run Code Online (Sandbox Code Playgroud)
在最后一个HTTP承诺解决之前,如何忽略流中的事件?
DOM event
A - - - - B - - - - C
HTTP event
D ...........done - C
Run Code Online (Sandbox Code Playgroud)
你可以尝试flatMapFirst哪些似乎做你想要的.以下代码可以工作(jsfiddle在这里 - 单击任意位置):
const stream = Observable.fromEvent(document, 'some-event')
stream
.flatMapFirst(() => httpRestService())
.subscribe(() => {
})
Run Code Online (Sandbox Code Playgroud)
引用文档:
flatMapFirst运算符类似于上面描述的flatMap和concatMap方法,但是,不是通过从源Observable转换项来发出运算符生成的所有Observable所发出的所有项,而是flatMapFirst将第一个Observable传播到它直到它在开始订阅下一个Observable之前完成.在当前Observable完成之前的Observable将被删除并且不会传播.
UPDATE
看一下源代码(https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/switchfirst.js)似乎虽然目前的观察结果尚未完成,但所有的在此期间传入的可观察量将被丢弃,即未被订阅.
因此,如果订阅这些观测触发HTTP调用(将看到的代码是有趣的httpRestService),那么就没有必要HTTP调用.如果通过调用函数立即触发这些调用并且结果通过observable传递,那么这些调用确实可能被不必要地触发.在这种情况下,使用defer运营商仅在订阅时进行http调用就可以轻松解决该问题.简而言之,如果您还没有它,则需要延迟执行其余请求.
| 归档时间: |
|
| 查看次数: |
2265 次 |
| 最近记录: |