发出一个对象作为可观察计时器

时间:2016-06-18 05:48:00

标签: javascript rxjs

我需要重放存储在数据库中的一系列事件。所以我想创建一个Observable Observable定时器流,当每个事件必须发出时,它们会消失。我的问题是我无法找到合适的方法将对象作为计时器的值发出。

让我设置一个简化(并且有点人为)的例子,但这解释了问题。

让我们从一个简单的延迟值数组开始

var delays = [200,100,1000,1200,300,1100];

及其相应的Observable计时器

var source= Rx.Observable
  .for(delays, t => Rx.Observable.timer(t) );

我可以观察到

source.subscribe( x => console.log(x) );

到目前为止一直很好,只在每个计时器completition中获得一个零列表。

然后,对于这个例子的上帝,我想获得所表达的延迟而不是原始顺序的事件;我想获得每个计时器数组的原始值和索引。

所以,我在可观察的

中添加了一个简单的地图
var source= Rx.Observable
  .for(delays, t => Rx.Observable.timer(t) )
  .map((x,i)=>{i,x}); 

并且,为了检查时间是否准确,我在观察者中添加了一块手表,

  var startTime = Date.now();    
  source.subscribe( x => console.log((Date.now()-startTime), x) );
  

这是我想要获得的

142 { i:1, x:100 }
204 { i: 0, x: 200 }
303 { i: 4, x: 300 }
1002 { i: 2, x: 1000 }
1101 { i: 5, x: 1100 }
1203 { i: 3, x: 1200 }

我没有得到数组中的原始索引,而是它们的发射顺序。

  

这是我获得的

1046 { x: 0, i: 0 }
1166 { x: 0, i: 1 }
1371 { x: 0, i: 2 }
2472 { x: 0, i: 3 }
3673 { x: 0, i: 4 }
3974 { x: 0, i: 5 }

将对象作为计时器的值发出的最大RxJS-esque技术是什么?

1 个答案:

答案 0 :(得分:1)

您只需flatMap计时器从数组中观察到一个可观察量,并map计时器的时间和索引。

const o = Rx.Observable;
const delays = [200,100,1000,1200,300,1100];
const delays$ = o.from(delays)
  .flatMap( (t, i) => o.timer(t).map({t,i}));

delays$.subscribe(x => console.log(x));

将发出

[object Object] {
  i: 1,
  t: 100
}
[object Object] {
  i: 0,
  t: 200
}
[object Object] {
  i: 4,
  t: 300
}
[object Object] {
  i: 2,
  t: 1000
}
[object Object] {
  i: 5,
  t: 1100
}
[object Object] {
  i: 3,
  t: 1200
}

jsbin example