来自 promise.each 的未处理拒绝
Un-handled rejection from promise.each
我正在尝试使用 bluebird 的 Promise.each() 进行多个数据库查询。我被卡住的部分是我无法处理所有拒绝(如果多个承诺失败)。如果我使用 Promise.all() 做同样的事情,它工作正常(它会!因为在 Promise.all() 中,如果 1 个承诺失败,结果也会被拒绝)。我的问题是:
我应该如何处理 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
方法不正确。此方法执行以下操作:
Iterate over an array, or a promise of an array, which contains promises (or a mix of promises and values) with the given iterator function with the signature (value, index, length) where value is the resolved value of a respective promise in the input array.
所以第一个参数必须是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
方法来 promisify 回调式 connection.query
函数。 Bluebird 已经提供了 promisification 功能,您不应该创建自己的功能。
我正在尝试使用 bluebird 的 Promise.each() 进行多个数据库查询。我被卡住的部分是我无法处理所有拒绝(如果多个承诺失败)。如果我使用 Promise.all() 做同样的事情,它工作正常(它会!因为在 Promise.all() 中,如果 1 个承诺失败,结果也会被拒绝)。我的问题是: 我应该如何处理 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
方法不正确。此方法执行以下操作:
Iterate over an array, or a promise of an array, which contains promises (or a mix of promises and values) with the given iterator function with the signature (value, index, length) where value is the resolved value of a respective promise in the input array.
所以第一个参数必须是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
方法来 promisify 回调式 connection.query
函数。 Bluebird 已经提供了 promisification 功能,您不应该创建自己的功能。