关于node.js:保证任意数量的回调的顺序执行顺序

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模块的on("message")上的otherApplication.publish(message)接收到事件时,我可以在需要执行的异步工作的回调中执行orderedPubSub.publish(id, message)。 >

我希望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"