我有一台服务器使用express-ws(https://www.npmjs.com/package/express-ws)。
app.ws("/someroute", (ws, req, res) => {
ws.on('message', (message) => {
someResponse(req.user.name, message, req.sessionID)
});
});
'someResponse'是异步的,调用各种数据库,'someResponse'的完成时间在很大程度上取决于确切的消息。对于每个sessionID,我希望按照收到消息的顺序评估“someResponse”。也就是说,如果有两条消息,第一次调用'someResponse'应该在第二次调用'someResponse'之前完成。 'someResponse'确实会返回一个承诺,所以如果es6 Promises包含在解决方案中会更好。谢谢你的帮助。
答案 0 :(得分:1)
创建并使用队列。 async
模块具有允许您指定并发性的功能(在您的情况下仅为1),您可以继续推送到队列,只要有项目入队,它就会自动处理队列。
例如:
var queue = async.queue(function(item, callback) {
someResponse(item.userName, item.message, item.sessionID).then(callback);
}, 1);
app.ws("/someroute", (ws, req, res) => {
ws.on('message', (message) => {
queue.push({
userName: req.user.name,
message: message,
sessionID: req.sessionID
});
// You can pass a callback after the pushed item/object if you want to
// know when the particular enqueued item finishes
});
});