当处理消息的函数异步地操作时,我如何处理传递到函数的一系列消息,按照它们的顺序进行处理?
举个例子:
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;
}
}备注
这类问题是否有任何事实上的/标准的解决办法?
发布于 2016-08-19 17:05:22
以下是一个总体方案:
您将在两点触发新消息的处理。首先,当新消息到达而您尚未处理消息时,当其他消息处理完成时,检查在处理过程中是否向队列中添加了其他内容。
您可以维护一个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);
}
});
}https://stackoverflow.com/questions/39044183
复制相似问题