【问题标题】:Making sure each async function is finished before next starts in server确保每个异步功能在服务器下一次启动之前完成
【发布时间】:2016-04-04 21:03:27
【问题描述】:

我有一个使用 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 会很好。谢谢你的帮助。

【问题讨论】:

  • 很难理解你的意思,你能用一个更简单的例子吗?

标签: node.js express asynchronous server queue


【解决方案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
  });
});

【讨论】:

    猜你喜欢
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2018-02-22
    • 1970-01-01
    相关资源
    最近更新 更多