RxJS等待承诺解决

RxJS wait until promise resolved

本文关键字:解决 承诺 等待 RxJS      更新时间:2023-09-26

我仍在研究反应式编程,所以我确信这是非常基本的,但流转换的数量对初学者来说是非常巨大的。

我正在从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请求,则需要延迟执行它。