Javascript 在RxJS中处理事件;“一次一个”;
我正在使用RxJS来处理事件流。可以调度相当多的事件,并且最终处理代码“相对昂贵”,例如加载文件、做一些工作、将一些内容保存到数据库Javascript 在RxJS中处理事件;“一次一个”;,javascript,node.js,rxjs,Javascript,Node.js,Rxjs,我正在使用RxJS来处理事件流。可以调度相当多的事件,并且最终处理代码“相对昂贵”,例如加载文件、做一些工作、将一些内容保存到数据库 const rx=require(“rxjs”) //模拟许多事件 可观测常数=接收间隔(1) //订阅活动 常量订阅=可观察 .订阅(x=>{ //在这里做昂贵的事情 }); 我希望subscribe中的代码“一次一个”(或者将来可能是“一次N个”),以便事件处理程序代码在下一个事件开始处理之前完全完成。现在似乎发生的事情是,subscribe中的代码会为每个
const rx=require(“rxjs”)
//模拟许多事件
可观测常数=接收间隔(1)
//订阅活动
常量订阅=可观察
.订阅(x=>{
//在这里做昂贵的事情
});
我希望subscribe
中的代码“一次一个”(或者将来可能是“一次N个”),以便事件处理程序代码在下一个事件开始处理之前完全完成。现在似乎发生的事情是,subscribe中的代码会为每个事件一次又一次地被调用,因此有许多事件同时被处理
我尝试了两种不同的方法(主要是在管道内部进行试验)rx.operators.throttle
丢弃事件,这不是我想要的-我只想保留它们。使用带有异步函数的flatMap
,只会延迟正在处理的流的开始
const\u worker=x=>{
返回新的可观察接收(订户=>{
设置超时(()=>{
订户。下一个(x*5)
订阅服务器。完成()
}, 5 * 1000);
})
}
常量订阅=可观察
.烟斗(
rxops.flatMap(_-worker)
)
.订阅(x=>{
});
所以我现在被困在这里了。这是可能的,还是我只是想以某种方式使用RxJS,而不是预期的方式?您想要concatMap
()
concatMap
将源可观测值映射到某个内部可观测值,在内部可观测值完成之前,它不会移动到源的下一个值
const source = rx.interval(1);
source.pipe(
concatMap(val => {
// Do expensive (async) work here and return an Observable.
// Next value from source won't be processed until this inner Observable
// completes (and no values from source will be skipped).
})
).subscribe()
非常感谢。确认全部要点如下: