Javascript 未处理对承诺的拒绝
我尝试使用bluebird的Promise.each()进行多个数据库查询。我陷入困境的部分是我无法处理所有的拒绝(如果多个承诺失败)。如果我使用Promise.all()做同样的事情,效果会很好(因为在Promise.all()中,如果1个Promise失败,结果也会被拒绝)。我的问题是: 我应该如何处理Promise.each()中的拒绝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的学生中选择计数(*);//重新校准错误 查询(查询,函数(错误,结果)
函数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);
});
}