保证任意数量回调的顺序执行

Guarantee sequential order of execution of an arbitrary number of callbacks

我正在订阅一个事件队列,每次我收到一个事件时,我都必须发出一个异步 HTTP 请求并发布响应,其顺序与我将事件接收到另一个队列的顺序相同。所以基本上订阅了一个 pub/sub 应用程序,进行一些异步计算并在没有另一个 pub/sub 应用程序的情况下发布计算结果。因为我没有设定数量的回调来执行,所以我不能使用 async.series.

我想做的是创建一个队列,让我插入一条消息和一个 id,并在每次插入的 id 等于最后发出的 id + 1 时发出一个事件。然后我会订阅到这个队列并在每次我从队列中得到一个事件时发布到我的 pub/sub 应用程序,因为这样可以保证顺序。

我需要做的似乎是一项非常常见的任务,但我一直没能找到相应的模块。 NPM 上是否已经有一些东西可以做到这一点,或者是否有更好的方法来完成我需要的东西?

我最终创建了自己的模块来完成我需要的工作,即能够订阅 pub/sub 应用程序并发布到另一个应用程序,在两者之间做一些异步工作但仍然保持顺序订阅者在其中接收消息。

有了这个模块,我可以在从第一个应用程序接收到事件时需要执行的异步工作的回调中执行 orderedPubSub.publish(id, message),在 on("message") 上执行 otherApplication.publish(message) ] 我的 OrderedPubSub 模块。

我希望有另一种方法可以做到这一点,或者 NPM 中已有一个模块。

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"