首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >串行处理处理异步消息的消息队列。

串行处理处理异步消息的消息队列。
EN

Stack Overflow用户
提问于 2016-08-19 16:51:33
回答 1查看 802关注 0票数 2

当处理消息的函数异步地操作时,我如何处理传递到函数的一系列消息,按照它们的顺序进行处理?

举个例子:

代码语言:javascript
运行
复制
var processMessage = function(msg) {
  switch (msg.action) {
    case "doFoo":
      this.processFoo(()=> {
        // `foo` is done processing
      });
    break;
    case "doBar":
      this.processBar(()=> {
        // `bar` is done processing
      });
    break;
    case "doBaz":
      this.processBaz(()=> {
        // `baz` is done processing
      });
     break;
  }
}

备注

  • 当然,我可以在数组中推送项目,然后使用异步eachSeries处理消息数组。
  • 然而,消息不断地出现,因此在数组中填充了要处理的更多项,导致处理步履蹒跚。

这类问题是否有任何事实上的/标准的解决办法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-19 17:05:22

以下是一个总体方案:

  1. 当新消息到达时,请检查一个标志,看看您是否已经在处理消息的过程中。如果设置了标志,只需将消息添加到队列中即可。
  2. 如果未设置标志,请检查队列,如果队列中有消息,则从队列中删除该消息。
  3. 当您开始处理该消息时,请设置一个标志,该标志指示您现在正在处理消息。
  4. 启动处理消息的异步操作。
  5. 当发出异步消息完成信号的回调发生时,清除标志以指示您正处于处理过程中,并递归地调用一个再次在步骤2开始的函数。

您将在两点触发新消息的处理。首先,当新消息到达而您尚未处理消息时,当其他消息处理完成时,检查在处理过程中是否向队列中添加了其他内容。

您可以维护一个inProcessing类型标志,这样当另一条消息已经在处理过程中时,您就不会不经意地开始处理传入的消息(这将强制执行您请求的串行执行)。

您必须严格处理错误条件,这样标记就不会被卡住,所以您的队列处理就不会停止。

在伪代码中(假设这些是队列对象上的方法,其中包含一个数组作为队列):

代码语言:javascript
运行
复制
addQueue: function(msg) {
    if (!this.inProcess) {
        // not currently processing anything so just process the message
        this.processMessage(msg);
    } else {
        this.queue.push(msg);
    }
},


processMessage: function(msg, completeFn) {
     var self = this;
     // must set this flag before going async
     self.inProcess = true;
     // asynchronously process this message
     someAsyncProcessing(msg, function(err) {
         self.inProcess = false;
         if (completeFn) {
             completeFn(err);
         }
         // see if anything else is in the queue to process
         if (self.queue.length) {
             // pull out oldest message and process it
             var msg = self.queue.shift();
             self.processMessage(msg);
         }
     });
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39044183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档