未经处理拒绝承诺

我试图使用蓝鸟的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

你正在使用Bluebird#each方法不正确。 该方法执行以下操作:

迭代一个数组,或者一个包含承诺(或承诺和值的混合)的数组的承诺与给定的迭代函数的签名(值,索引,长度),其中值是相应承诺的parsing值input数组。

所以第一个参数必须是一个promise / values数组,第二个参数是一个callback,它接受三个参数: 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方法来提示callback式connection.query函数。 蓝鸟已经提出了promisificationfunction,你不应该创build自己的。