RxJS等到承诺解决了

时间:2016-05-11 21:50:19

标签: javascript reactive-programming rxjs

我仍在计算反应式编程,所以我很确定这是非常基本的,但是对于初学者来说,流转换的数量非常大。

我正在从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

1 个答案:

答案 0 :(得分:6)

您可以尝试flatMapFirst,这似乎可以做您想要的。以下代码可以工作(jsfiddle here - 点击任意位置):

const stream = Observable.fromEvent(document, 'some-event')
stream
  .flatMapFirst(() => httpRestService())
  .subscribe(() => {
  })

引用文档:

  

flatMapFirst运算符类似于上面描述的flatMap和concatMap方法,但是,不是通过从源Observable转换项来发出运算符生成的所有Observable发出的所有项,而是flatMapFirst传播第一个Observable只有在它开始之前完成才能订阅下一个Observable。 当前Observable完成之前的Observable将被删除,不会传播。

<强>更新

查看源代码(https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/switchfirst.js)似乎虽然当前的observable尚未完成,但同时所有传入的可观察对象都将被丢弃,即未被订阅。

因此,如果订阅这些observable会触发http调用(看到httpRestService的代码会很有趣),那么就没有不必要的http调用。如果通过调用函数立即触发这些调用并且结果通过observable传递,那么这些调用确实可能被不必要地触发。在这种情况下,使用defer运算符仅在订阅时执行http调用就可以轻松解决该问题。简而言之,如果您还没有其他请求,则需要延迟执行其余请求。