使用RxJs Observable实现延迟队列

时间:2016-10-17 13:09:02

标签: javascript angular rxjs

想象一下,我们有一个布尔队列(我们不需要复杂的数据结构,因为我们只想存储订单的事实)。物品可以随时以任何速度进入队列。 Observable将从此队列中弹出项目并以延迟方式发出它们,但不需要延迟第一次发射。在队列变空之后,它将保持不变,直到新项目进入队列,它将立即发出。请帮我实现这种行为。

鉴于用户可以按下增加计数器的按钮。启动时,计数器为0,用户在500 ms内单击两次。第一次单击将计数器增加到1,但第二次单击将延迟500 ms。然后,用户等待超过500毫秒并单击。第三次点击必须立即增加计数器,因为没有其他增量动作正在进行中。如果第三次点击发生在500毫秒窗口,那么它必须等到另一个完成。

是的,我想我得到了你的问题@estus。不知何故,必须注册其进度中的最后一个动作。节省发射时间或其他时间。

鉴于第一次点击发生在300ms之前并且发生了新的点击。在这种情况下,第二次单击只需要等待200ms。 enter image description here

UPDATE1: Here是基于Dorus的答案的代码

1 个答案:

答案 0 :(得分:6)

您可以使用concatMap

delay = 1000; // delay in ms
queue.concatMap(e =>
    Rx.Observable.of(e) // emit first item right away
      .concat(Rx.Observable.empty().delay(delay)) // delay next item
  )
相关问题