2016-04-04 27 views
0

我有一个使用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 Promise包含在解决方案中,那将会很好。谢谢你的帮助。

+0

这是很难理解你的意思,你可以用一个简单的例子? – lauriys

回答

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 
    }); 
}); 
相关问题