Javascript 未处理对承诺的拒绝

Javascript 未处理对承诺的拒绝,javascript,node.js,promise,bluebird,Javascript,Node.js,Promise,Bluebird,我尝试使用bluebird的Promise.each()进行多个数据库查询。我陷入困境的部分是我无法处理所有的拒绝(如果多个承诺失败)。如果我使用Promise.all()做同样的事情,效果会很好(因为在Promise.all()中,如果1个Promise失败,结果也会被拒绝)。我的问题是: 我应该如何处理Promise.each()中的拒绝 函数foo(bar){ 返回新承诺(解决、拒绝){ var query=“从1=1的学生中选择计数(*);//重新校准错误 查询(查询,函数(错误,结果)

我尝试使用bluebird的Promise.each()进行多个数据库查询。我陷入困境的部分是我无法处理所有的拒绝(如果多个承诺失败)。如果我使用Promise.all()做同样的事情,效果会很好(因为在Promise.all()中,如果1个Promise失败,结果也会被拒绝)。我的问题是: 我应该如何处理Promise.each()中的拒绝

函数foo(bar){
返回新承诺(解决、拒绝){
var query=“从1=1的学生中选择计数(*);//重新校准错误
查询(查询,函数(错误,结果){
如果(错误){拒绝(错误)}解决(结果);
})
}
}
函数api(req、res){
var任务=[];
对于(变量i=0;i<10;i++){
推(foo(bar));
}
Promise.each(tasks.catch(err=>{return err;});
res.send('消息')
}    
答复:
未处理的拒绝错误:ER\u PARSE\u Error

您错误地使用了
蓝鸟#每个
方法。此方法可执行以下操作:

迭代一个数组或一个数组的承诺,该数组包含承诺(或承诺和值的组合),给定迭代器函数具有签名(值、索引、长度),其中值是输入数组中相应承诺的解析值

因此,第一个参数必须是承诺/值的数组,第二个是接受三个参数的回调:
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已经提供了Promission功能,您不应该创建自己的功能。

我认为对于第一次拒绝,catch会处理拒绝并返回错误。但是,对于随后的拒绝,没有人能够抓住他们。
foo
没有回复承诺。其中定义了
拒绝
解决
?@alexmac错误,已更正。刚才在这里写了一个例子。你是说
promisify.all
(它包含一系列承诺)而不是
承诺。每个
?我想要的只是一系列承诺。所有
都使用Bluebird#promisify来承诺回调风格的连接。查询函数。
这有什么帮助,又有什么不同?如果我已经从函数foo(bar)返回了一个承诺。另外,我修改了这个示例,只是在这里显示它无法处理拒绝,所以如果我只使用catch with promise.each()这会是一个问题吗?这只是一个建议,是错误使用
Bluebird#each
方法的真正问题,我提到过这一点。蓝鸟#promisify
怎么样,你已经在使用蓝鸟模块了,为什么要创建自行车(我的意思是使用
Promise
构造函数),当此库已经具有所需功能时?
其中value是输入数组中相应承诺的解析值。
但是这里的
任务
不是承诺数组,任务也不会
beIt不是关于
蓝鸟#每个
方法-承诺和值数组中的第一个参数,但是关于第二次回调。这个回调应该返回一个承诺,您的
foo
函数将返回它。
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);
    });
}