Events RxJs:如何在预定义的时间发出事件?

Events RxJs:如何在预定义的时间发出事件?,events,rxjs,rxjs5,timed,Events,Rxjs,Rxjs5,Timed,我有一些预定义的事件设置为在特定时间发生。 我有一个计时器,像这样: const timer = Rx.Observable.interval(100).timeInterval() .map(x => x.interval) .scan((ms, total) => total + ms, 0) const times$ = Rx.Observable .from([{"val":"jeff", "t": 1000}, {"val

我有一些预定义的事件设置为在特定时间发生。 我有一个计时器,像这样:

const timer = Rx.Observable.interval(100).timeInterval()
    .map(x => x.interval)
    .scan((ms, total) => total + ms, 0)
const times$ = Rx.Observable
                 .from([{"val":"jeff", "t": 1000}, {"val":"fred", "t": 2500}])
                 .flatMap(x => Rx.Observable.timer(x.t).map(y => x.val));
计时器发出接近100200300400500的信号(尽管实际上它更像101200302401500…这完全没问题) 我也有一些我想在某些时候做的事情。例如,假设我想在以下时间做一些事情:

const stuff = Rx.Observable.from([1000, 2000, 2250, 3000, 5000]);
我想要的是将“stuff”和“timer”组合在一起,以这样一种方式生成的流每次在“stuff”中定义一个值(或者稍晚一点)。在这种情况下,t=1000毫秒、2000毫秒、2250毫秒、3000毫秒和5000毫秒。注意:由于间隔的大小,2250家伙应该在2300左右发射。那很好。他们不能早到,也不能多来一次

我有一个解决方案,但不是很好。它每一步(本例中每100毫秒)都会重新启动“填充”,并对其进行过滤,然后取1。我更希望,一旦一个事件从“stuff”中发出,它就消失了,这样后续的过滤器就不会有这些值

在实际的应用程序中,会有stuff和stuff 2,可能还有stuff 3…(但我会称它们为其他名称!)


提前谢谢!我希望这是清楚的。

如果我正确理解了您的目标,那么通过一个简单的投影就可以实现:

const times$ = stuff.flatMap(x => Rx.Observable.timer(x));
以下是一个工作示例:

编辑

对于第二个要求,请尝试以下操作:

const timer = Rx.Observable.interval(100).timeInterval()
    .map(x => x.interval)
    .scan((ms, total) => total + ms, 0)
const times$ = Rx.Observable
                 .from([{"val":"jeff", "t": 1000}, {"val":"fred", "t": 2500}])
                 .flatMap(x => Rx.Observable.timer(x.t).map(y => x.val));

这是我根据Matt的解决方案编写的一个typescript函数

从'rxjs'导入{from,timer};
从“rxjs/operators”导入{flatMap,map};
导出接口ActionQueueEntry{
动作:字符串;
有效载荷?:任何;
延迟:数字;
}
导出函数actionQueue(条目:ActionQueueEntry[]){
从(条目)返回。管道(平面图((x:any)=>{
返回计时器(x.delay).pipe(map(y=>x));
}));
}
const q=actionQueue([
{动作:'说:你好',延迟:500},
{行动:'问:你好吗',延迟:2500},
{动作:'说:我很好',延迟:5000},
]);
q、 订阅(console.log);

这并不是我想要的……这些东西的数组不是它们之间的延迟,而是它们应该发生的时间。不过我可以随时改变。让我看看。。。但我想知道的一件事是,东西不仅仅是一个数字数组,它会像[{“t”:1000,“val”:“xyz”}],实际上,我想要的是“xyz”在时间1000时发出。不过,让我来玩玩这个……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毫秒的“jeff”,2500毫秒的“fred”…不是jeff之后的2500毫秒,而是我提供的解决方案将在指定时间发出。如果运行我包含的示例,您会注意到第二个和第三个元素之间的时间非常短(250ms,而不是2250ms)。还是我还是误会了?是的,很有效,谢谢!现在我只想弄清楚它为什么有效。似乎对于数组中的每个项目,它都会创建一个新的可观察计时器,并等待“t”数量,因此时间将是项目之间的时间,但它不是…这是我想要的方式…我只是不知道为什么。呃,这东西让人困惑。你很接近。它确实为源可观察对象(从数组创建)中的每个元素创建了一个新的计时器可观察对象,然后将它们展平为单个可观察对象。因为它们都是相对于起始点的,而不是彼此的,所以会产生期望的结果。当我第一次开始使用Rx时,我遇到的最大困难是观测值的可观测性(以及与之相关的操作符,如flatMap)。我建议你花些时间来适应这方面的需求。