当处理消息的函数异步操作消息时,如何处理按函数按顺序传递的一系列消息?
一个例子:
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;
}
}
这类问题是否存在事实上/标准的解决方案?
答案 0 :(得分:2)
这是一个一般方案:
您在两点触发处理新邮件。首先,当新消息到达且您尚未处理消息时,其次在处理其他消息时,您将检查在处理过程中是否有其他任何内容添加到队列中。
您维护一个inProcessing
类型标志,这样当另一条消息已经处于处理过程中时,您不会无意中开始处理传入消息(这会强制您请求的串行执行)。
你必须严格处理错误条件,这样标志永远不会卡住,所以你的队列处理永远不会停滞。
在伪代码中(假设这些是包含数组作为队列的队列对象上的方法):
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);
}
});
}