我仍在研究反应式编程,所以我很确定这是非常基础的,但是流转换的数量对于初学者来说是相当巨大的。
我正在从 DOM 事件创建一个 Observable。此事件应依次触发 REST 调用,并且所有其他 DOM 事件将被忽略,直到此事件得到解决。
const stream = Observable.fromEvent(document, 'some-event')
stream
.flatMap(() => httpRestService())
.subscribe(() => {
})
在最后一个 HTTP Promise 解决之前,如何忽略流中的事件?
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 方法,但是,它不是发出该运算符通过转换源 Observable 中的项而生成的所有 Observable 发出的所有项,而是专门传播第一个 Observable,直到它出现为止。在开始订阅下一个 Observable 之前完成。在当前 Observable 完成之前出现的 Observable 将被删除并且不会传播。
UPDATE
查看源代码(https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/switchfirst.js)似乎虽然当前的可观察量尚未完成,但同时所有传入的可观察量都将被丢弃,即不订阅。
因此,如果订阅这些可观察量会触发 http 调用(查看代码会很有趣)httpRestService
),那么就没有不必要的http调用了。如果这些调用是通过调用函数立即触发的,并且结果通过可观察对象传递,那么这些调用有可能确实被不必要地触发。在这种情况下,使用以下方法可以轻松解决该问题defer
操作员仅在订阅时进行 http 调用。简而言之,如果您还没有其余请求,则需要延迟执行它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)