Javascript RxJS等待承诺解决

Javascript RxJS等待承诺解决,javascript,reactive-programming,rxjs,Javascript,Reactive Programming,Rxjs,我仍然在研究反应式编程,所以我很确定这是非常基本的,但是对于初学者来说,流转换的数量是非常巨大的 我正在从DOM事件创建一个可观察对象。此事件应反过来触发REST调用,在解决此事件之前,将忽略所有其他DOM事件 const stream = Observable.fromEvent(document, 'some-event') stream .flatMap(() => httpRestService()) .subscribe(() => { }) 如何忽略流中的事

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

我正在从DOM事件创建一个可观察对象。此事件应反过来触发REST调用,在解决此事件之前,将忽略所有其他DOM事件

const stream = Observable.fromEvent(document, 'some-event')
stream
  .flatMap(() => httpRestService())
  .subscribe(() => {
  })
如何忽略流中的事件,直到最后一个HTTP承诺得到解决

DOM event
A - - - - B - - - - C
HTTP event
D ...........done - C
你可以试着做你想做的事。以下代码可以工作(-click anywhere):

引用文件:

flatMapFirst操作符类似于上面描述的flatMap和concatMap方法,但是,它不发射操作符通过转换源可观测项生成的所有可观测项所发射的所有项,flatMapFirst将以独占方式传播第一个可观察对象,直到它完成后才开始订阅下一个可观察对象在当前可观察对象完成之前出现的可观察对象将被删除,并且不会传播。

更新

从源代码()来看,虽然当前的可观测数据尚未完成,但同时所有传入的可观测数据都将被丢弃,即未订阅


因此,如果订阅这些可观察对象触发http调用(查看
httpRestService
的代码会很有趣),那么就没有不必要的http调用。如果通过调用函数立即触发这些调用,并且结果通过一个可观察对象传递,那么这些调用确实有可能被不必要地触发。在这种情况下,通过使用
defer
操作符仅在订阅时进行http调用,这个问题很容易解决。简而言之,如果您还没有rest请求,则需要延迟执行它。

首先,观察者不发出值,而是接收值。所以这里你的观察者是可观察的。那我不知道你说的“忽略”是什么意思。这些事件是否丢失或排队?介绍问题的最佳方式是指定输入和预期输出。这最好用大理石做diagram@user3743222updatedmaybe
skipUntil
将是您要寻找的吗?我要咬一口——为什么要在最后一个HTTP承诺得到解决之前忽略所有DOM事件?是因为在最后一个HTTP调用解决之前,您不想触发其他HTTP调用吗?如果是这样的话,您可以禁用输入/显示微调器/其他任何东西来阻止DOM事件的发生吗?否则,我同意@Stephen--
skipUntil
可能最接近你想要的。还有
pausable
我很乐意知道提议的解决方案有什么问题,因为我发现它被否决了。这是完美的。非常感谢。你确定这是你想要的吗?除非我弄错了,否则它仍然会为每个文档事件调用httpRestService调用,它将丢弃所有结果,直到前一个调用返回。更准确地说,当当前可观察对象尚未完成时,同时所有传入的可观察对象都将被丢弃,即未订阅。因此,如果订阅这些可观察对象触发http调用,那么就没有不必要的http调用。如果这些调用是通过调用函数立即触发的,并且只是通过可观察对象传递的结果,那么这些调用确实有可能被不必要地触发。在这种情况下,通过使用
defer
操作符仅在订阅时进行http调用,这个问题很容易解决。感谢您的澄清!在运行示例代码之后,我有一种感觉,就是这样,但是您的解释非常清楚。
const stream = Observable.fromEvent(document, 'some-event')
stream
  .flatMapFirst(() => httpRestService())
  .subscribe(() => {
  })