2016-06-11 57 views
2

我有一些预定义的事件发生在特定的时间。 和我有一个计时器,就像这样:RxJs:如何在预定义时间发射事件?

const timer = Rx.Observable.interval(100).timeInterval() 
    .map(x => x.interval) 
    .scan((ms, total) => total + ms, 0) 

计时器发出了接近100,200,300,400,500(虽然实际上它更像是101,200,302,401,500 ......这完全是罚款) 我也有一些东西,我想做的事情在某些时候。例如,假设我要在以下时间做的东西:

const stuff = Rx.Observable.from([1000, 2000, 2250, 3000, 5000]); 

我想是“东西”和“计时器”以这样的方式相结合所产生的气流发出一次每一个值在那个时候(或者稍后的时间)定义在“东西”中的时间。在这种情况下,这将是t = 1000ms,2000ms,2250ms,3000ms和5000ms。注意:由于间隔大小,2250男性应该在2300左右发射。没关系。他们不能提早或不止一次。

我有一个解决方案,但它不是很好。它会在每一步(本例中每100毫秒)重新启动“东西”并对其进行过滤,并将其过滤为1.我更喜欢这样,一旦事件从“东西”发出,它就会消失,它没有这些价值。

在实际应用中,会出现的东西,stuff2,也许stuff3 ......(但我会打电话给他们别的东西!)

提前感谢!我希望这一点很明确。

回答

5

如果我理解你正确地后在做什么,这应该是一个简单的投影实现的:

const times$ = stuff.flatMap(x => Rx.Observable.timer(x)); 

这里的工作示例:https://jsbin.com/negiyizibu/edit?html,js,console,output

编辑

对于第二要求,请尝试如下所示:

const times$ = Rx.Observable 
       .from([{"val":"jeff", "t": 1000}, {"val":"fred", "t": 2500}]) 
       .flatMap(x => Rx.Observable.timer(x.t).map(y => x.val)); 

https://jsbin.com/cegijudoci/edit?js,console,output

+0

这不是我想要的东西......东西的数组不是他们之间的延迟,而是他们应该发生的时间。但我总是可以改变这一点。我想知道的一件事是,东西不会只是一个数字数组,它会像[{“t”:1000,“val”:“xyz”} ],真的,我所追求的是在时间1000发射“xyz”。尽管如此,虽然...玩弄 –

+0

const stuff = Rx.Observable.from([{“val”:“jeff”,“t “:1000},{”val“:”fred“,”t“:2500}]); stuff .flatMap(x => Rx.Observable.timer(x.t)) .subscribe(x => console.log(x)); //它只是吐出“0”。我想1000毫秒的“杰夫”,2500毫秒的“弗雷德”......杰夫后2500毫秒,但1500 –

+0

我提供的解决方案将在指定的时间发射。如果你运行包含的样本,你会注意到第二和第三个元素之间的时间非常短(250ms,而不是2250ms)。还是我仍然误解? –