来自promise.each

时间:2017-10-02 19:26:04

标签: javascript node.js promise bluebird

我尝试使用bluebird的Promise.each()进行多个数据库查询。我遇到的部分是我无法处理所有拒绝(如果多个承诺失败)。如果我使用Promise.all()做同样的事情它可以正常工作(它会!因为在Promise.all()中,如果1 promise失败,结果也会被拒绝)。我的问题是: 我应该如何处理Promise.each()中的拒绝?

function foo(bar){
  return new Promise(resolve, reject){
  var query = "elect count(*) from students Where 1=1";//DELIBRATE MISTAKE
  connection.query(query, function(err, result){
    if(err){reject(err)}resolve(result);
  })
 }
}
function api(req, res){
  var tasks = [];
  for(var i = 0; i < 10; i++){
     tasks.push(foo(bar));
  }
  Promise.each(tasks).catch(err=>{return err;});
  res.send('message')
}    

响应: Unhandled rejection Error: ER_PARSE_ERROR

1 个答案:

答案 0 :(得分:2)

您错误地使用了Bluebird#each方法。此方法执行以下操作:

  

迭代一个数组或一个数组的promise,它包含promises(或promises和values的混合)和给定的迭代器函数以及签名(value,index,length),其中value是a的解析值输入数组中各自的承诺。

所以第一个参数必须是promises / values数组,第二个参数是一个接受三个参数的回调:value, index, length

工作示例:

let queryAsync = Promise.promisify(connection.query, { context: connection });

function foo(bar) {
  var query = 'elect count(*) from students Where 1=1'; // DELIBRATE MISTAKE
  return queryAsync(query);
}

function api(req, res){
  var tasks = [/* TODO: fill array with taskIds or something else*/];

  Promise
    .each(tasks, task => foo(task))
    .then(() => res.send('message'))
    .catch(err => {
      console.log(err);
      res.status(500).send(err);
    });
}

在上面的示例中,我使用Bluebird#promisify方法来宣传回调式connection.query函数。 Bluebird已经提供了promisification功能,你不应该创建自己的功能。