我有一个像这样的观察者。
var source = rx.Observable.fromEvent(eventAppeared.emitter, 'event')
.filter(mAndF.isValidStreamType)
.map(mAndF.transformEvent)
.share();
然后我与一些订阅者分享。这些订阅者都接受事件并对它们执行一些异步操作。 所以我的订阅者就像
source.subscribe(async function(x) {
const func = handler[x.eventName];
if (func) {
await eventWorkflow(x, handler.handlerName, func.bind(handler));
}
});
那里有一些额外的东西,但我认为意图很清楚。 我需要每个"处理程序"处理此特定事件以处理它并阻止它返回。然后处理下一个事件。
我在上面的代码中发现,它只是在没有等待它的情况下调用该事件而我的处理程序正在踩踏自己。
我已经阅读过相当多的帖子,但我真的不知道该怎么做。大多数人都在谈论让观察者等待。但那不是我需要的吗?看来我需要的是让观察者等待。我无法找到任何关于它的东西,这通常意味着它要么超级简单,要么超级荒谬。我希望前者。
如果您需要进一步澄清,请与我们联系。
--- ---更新
我所意识到的是我需要的是一个fifo队列或缓冲区(先进先出),有时也称为背压。我需要按顺序处理所有消息,并且只有在完成前面的消息处理时才需要处理。
---结束更新---
起初我认为这是因为我使用的是rx 2.5.3,但我刚升级到4.1.0并且它仍然不同步。
答案 0 :(得分:3)
没有办法告诉源可观察事件将事件置于subscribe
内,它只是让我们“观察”传入的事件。异步事物应该通过Rx操作符来管理。
例如,要让异步处理程序按顺序处理事件,您可以尝试使用concatMap
运算符:
source
.concatMap(x => {
const func = handler[x.eventName];
return func ?
eventWorkflow(x, handler.handlerName, func.bind(handler)) :
Rx.Observable.empty();
})
.subscribe();
请注意,在上面的示例中,await
不需要concatMap
,因为eventWorkflow
知道如何处理concatMap
返回的承诺:CertificateExtensions ext = new CertificateExtensions();
ext.set(SubjectAlternativeNameExtension.NAME, new SubjectAlternativeNameExtension(....*));
// * a `GeneralNames` object including a `GeneralName` object including (for example) an `IPAddressName` object.
将其转换为可观察的等待并等待直到观察完成后再继续下一个事件。
答案 1 :(得分:1)
所以我最终发现,我需要的更准确地描述为fifo队列或缓冲区。我需要消息等到上一条消息完成处理。
我也很确定rxjs没有提供此功能(有时也称为背压)。所以我所做的只是导入一个fifo队列并将其挂钩到每个订阅者。
我正在使用并发队列,到目前为止似乎工作得很好。