如何将`resolve`注入回调?

时间:2016-03-17 21:18:40

标签: node.js promise closures

我想在express中组合中间件以使它们并行,而不是顺序如果你放入app.use(path, /* middlewares *,/ callback)

我写了以下函数:

function makeParallelMiddleware(args) {
  let makePromises = (req, res) => args.map((func) => {
    return new Promise((resolve, reject) => {
      console.log('In promise: ' + func.name);
      func(req, res, resolve);
    })
  });
  return (req, res, next) => Promise.all(makePromises(req, res)).then(next())
}

但这似乎不能正常工作。我使用以下两个中间件进行测试:

function middlewareA(req, res, next) {
  req.A = 1;
  console.log('I am in A');
  setTimeout(() => {
    console.log('I am in A delay');
    if (req.C) {
      req.C = 'BA'
    } else {
      req.C = 'A'
    }
    next()
  }, 1000)
}

function middlewareB(req, res, next) {
  req.B = 1;
  if (req.C) {
    req.C = 'AB'
  } else {
    req.C = 'B'
  }
  next()
}

app.get('/parallel', makeParallelMiddleware([middlewareA, middlewareB]) ,(req, res) => {
  res.send(req.C);
});

当我访问/parallel时,我只能获得“B”而不是“BA”。

如果在req.C设置之前解决了承诺怎么可能?如何更正此项以获得所需结果?

1 个答案:

答案 0 :(得分:1)

改变这个:

return (req, res, next) => Promise.all(makePromises(req, res)).then(next())
//                                                   remove parens here ^^ 

到此:

return (req, res, next) => Promise.all(makePromises(req, res)).then(function(results) {
    next();
});

您正在立即调用next(),而不是传递稍后可以通过.then()方法调用的函数引用。另外,next()可能不喜欢传递给它的数组,这是.then()在你的情况下会传递的数据,所以最好只包装一个自定义函数并调用plain {{ 1}}。

而且,如果你的任何一个承诺拒绝他们抛出异常,你还需要一些错误处理。