确保每个异步功能在服务器下次启动之前完成

时间:2016-04-04 21:03:27

标签: node.js express asynchronous server queue

我有一台服务器使用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包含在解决方案中会更好。谢谢你的帮助。

1 个答案:

答案 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
  });
});