Node.js ExpressJS后端将请求放入队列

Node.js ExpressJS后端将请求放入队列,node.js,express,promise,bluebird,Node.js,Express,Promise,Bluebird,我让客户端发送任务,由服务器执行,但这些请求应该以类似队列的方式处理。你知道我该怎么做吗?谢谢 express.Router().post('/tasks',函数(req,res){ //这是要执行的任务。在执行时,另一个用户 //可能会发送请求,并且仅应在完成此操作后进行处理。 //如果挂起的任务已完成,则还应标记该任务。 承诺.解决(要求正文) .然后(函数(){ //.. }) .catch(函数(错误){ //.... }) })当然,这很简单,假设您有一个函数fn返回一个承诺 var

我让客户端发送任务,由服务器执行,但这些请求应该以类似队列的方式处理。你知道我该怎么做吗?谢谢

express.Router().post('/tasks',函数(req,res){
//这是要执行的任务。在执行时,另一个用户
//可能会发送请求,并且仅应在完成此操作后进行处理。
//如果挂起的任务已完成,则还应标记该任务。
承诺.解决(要求正文)
.然后(函数(){
//..
})
.catch(函数(错误){
//....
})

})
当然,这很简单,假设您有一个函数
fn
返回一个承诺

var res = fn(req.body); // returns the appropriate promise
您想在其中添加排队。您必须执行以下操作:

var queuedFn = queue(fn);

express.Router().post('/tasks', function(req, res) {
    queuedFn(req.body).then(v => res.json(v), e => res.error(e));
});
  • fn排队
    装饰
    fn
    ,这样当调用
    fn排队
    时,我们:
    • 为价值创造新的承诺
    • 排队工作
幸运的是,这正是Promissions在
then
中所做的,因此我们可以重用它,而不是实现我们自己的排队逻辑:

function queue(fn) {
    var queue = Promise.resolve(); // create a queue
    // now return the decorated function
    return function(...args) {
       queue = queue.then(() => { // queue the function, assign to queue
          return fn(...args); // return the function and wait for it
       });
       return queue; // return the currently queued promise - for our argumnets
    }
}
这将让我们做一些类似的事情:

var queuedFn = queue(fn);

express.Router().post('/tasks', function(req, res) {
    queuedFn(req.body).then(v => res.json(v), e => res.error(e));
});
看一看