[英]How to chain observables in rx.js
我有一个 observable,它从服务器拉取事件,过滤应用程序类型的事件,然后订阅事件并将其分派给一个或多个处理程序来处理。
然后处理程序 go 关闭并对数据库进行一些异步更新,我发现可观察对象会如此快速地启动事件,以至于更新相互影响。 我应该预料到的。
所以我认为我需要我的处理程序每个都使用自己的可观察对象来充当队列,该队列将处理一个事件并等待确认。
所以我的问题是,我怎样才能创建一个连续接收消息并一次发送一条消息的可观察对象,等待确认后再发布下一条消息?
我认为可观察对象也需要是冷的,因为我不能丢失消息。
我认为运营商concatMap
所做的事情与您正在寻找的东西很接近。 您可以在此处查看以前的答案,以说明concatMap
的类似用例: RxJS 排队相关任务
它很接近但不完全是你想要的,因为没有等待ACK
信号来释放下一个值。 相反, concatMap
使用当前“已执行”可观察对象的完成信号来订阅下一个。 如果您的可观察对象在某处包含对数据库执行更新,那么这些更新将按顺序执行。 例如:
function handler (source$) {
// source$ is your source of events from which you generate the update calls
return source$.concatMap(function (event){
return updateDB(event);
})
}
function updateDB(event) {
return Rx.Observable.create(function(observer){
// do the update in the db
// you probably have a success and error handler
// you plug the observer notification into those handlers
if (success) {
// if you need to pass down some value from the update
observer.onNext(someValue);
// In any case, signal completion to allow concatMap to move to next update
observer.onCompleted();
}
if (error) {observer.onError(error);}
})
}
这是专门针对您正在使用的库的通用代码。 您可以直接使用运算符fromNodeCallback
或fromCallback
,具体取决于数据库更新 function 的 API。
尽管如此,请注意,在执行当前可观察对象时,可能会涉及一些缓冲以保持下一个可观察对象,并且该缓冲区只能是有限的,因此如果生产者和消费者之间的速度确实存在显着差异,或 memory 限制,您可能希望以不同的方式处理事情。
此外,如果您使用的是 RxJS v5, onError
变为error
, onComplete
变为complete
, onNext
变为next
(参见 新观察者界面)。
最后评论,您的 stream 的有损/无损性质是一个概念,不同于 stream 的冷热性质。您可以查看这两种流的图示订阅和数据流。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.