RxJS等到承诺解决了

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)

use*_*222 6

你可以尝试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调用就可以轻松解决该问题.简而言之,如果您还没有它,则需要延迟执行其余请求.

  • 更确切地说,虽然当前的可观察量尚未完成,但同时所有传入的可观察量将被丢弃,即未被订阅.因此,如果订阅这些observable会触发http调用,那么就没有不必要的http调用.如果通过调用函数立即触发这些调用,并且它只是通过observable传递的结果,那么这些调用确实可能被不必要地触发.在这种情况下,使用`defer`运算符仅在订阅时执行http调用就可以轻松解决该问题. (3认同)
  • 你确定这是给你想要的吗?除非我弄错了,否则它仍然会为每个文档事件调用httpRestService调用,它只会抛出所有结果,直到返回上一个调用. (2认同)