延迟rxjs 5使用调度程序在数据中定义的时间可观察到的发射

时间:2017-01-22 12:02:38

标签: rxjs rxjs5

我想按照数据中定义的延迟延迟数据流:

Rx.Observable.from([
  {message: "one", delay: 100}, 
  {message: "two", delay: 500}, 
  {message: "three", delay: 10500}
]).subscribe((e) => console.log(e.message))
  1. 100 ms后应记录“1”,500 ms后记录“2”。
  2. 我希望能够在发出消息“三”之前取消定时器。
  3. 如何定义rxjs 5调度程序来实现它?

1 个答案:

答案 0 :(得分:4)

根据您想要延迟的 ,您可以选择几条路线:

延迟每次发射之间的给定时间

使用.concatMap每次排放必须等待延迟的先前排放在下一次排放之前完成:

Rx.Observable.from([
  {message: "one", delay: 500}, 
  {message: "two", delay: 500}, 
  {message: "three", delay: 500}
])
.concatMap(val => Rx.Observable.of(val.message).delay(val.delay))
.subscribe(val => console.log(val))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.3/Rx.js"></script>

每次排放都在前一次完成后到达。

延迟应该相对于流的开始:

使用.mergeMap所有排放将在抵达时开始,并且延迟将在那时开始。

Rx.Observable.from([
  {message: "one", delay: 500}, 
  {message: "two", delay: 500}, 
  {message: "three", delay: 500}
])
.mergeMap(val => Rx.Observable.of(val.message).delay(val.delay))
.subscribe(val => console.log(val))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.3/Rx.js"></script>

请注意,所有三种排放都会同时到达。

通过使用标准Rx运算符,您可以获得取消支持。只需取消订阅流即可忽略所有待处理的未来排放。