Guarantee sequential order of execution of an arbitrary number of callbacks
我正在订阅事件队列,每次收到事件时,我都必须发出异步HTTP请求并发布响应,其接收顺序与接收事件到另一个队列的顺序相同。因此,基本上是订阅pub / sub应用程序,进行一些异步计算,然后再发布计算结果,而无需其他pub / sub应用程序。由于我没有一定数量的回调要执行,因此无法使用async.series。
我想做的是创建一个队列,该队列让我插入一条消息和一个id,并且每次插入的id等于发出的最后一个id时都会发出一个事件。然后,我将订阅此队列并在每次队列中发生事件时将其发布到我的pub / sub应用程序,因为那样可以保证顺序顺序。
我需要做的似乎是一项非常普通的任务,但我还没有找到用于此目的的模块。 NPM上是否已经有此功能,或者有更好的方法来满足我的需求?
我最终创建了自己的模块来执行我需要的模块,该模块能够订阅pub / sub应用程序并发布到另一个应用程序,在它们之间进行一些异步工作,但仍保持消息的顺序被订户接收。
有了这个模块,当我从第一个应用程序接收到一个事件以及我的OrderedPubSub模块的
我希望NPM中已经有另一种方法或模块了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | const EventEmitter = require('events'); class OrderedPubSub extends EventEmitter { constructor(initialId = 0) { super() this.lastPublishedId = initialId this.messages = {} } publish(id, message) { this.messages[id] = message this.publishAllAvailable() } publishAllAvailable() { let messageId; while((messageId = this.lastPublishedId + 1) in this.messages) { const message = this.messages[messageId] delete this.messages[messageId] this.lastPublishedId++ this.emit("message", message) } } } const orderedPubSub = new OrderedPubSub(); orderedPubSub.on('message', message => { console.log(`Received message:"${message}"`) }); orderedPubSub.publish(3,"third message") orderedPubSub.publish(2,"second message") orderedPubSub.publish(4,"fourth message") orderedPubSub.publish(10,"tenth message") orderedPubSub.publish(1,"first message") //outputs // Received message:"first message" // Received message:"second message" // Received message:"third message" // Received message:"fourth message" |