我需要重放存储在数据库中的一系列事件。所以我想创建一个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技术是什么?
答案 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
}