我是承诺的新手,我将多个项目保存到MongoDB数据库。
对于单个项目,我有一个返回promise的函数,该函数在保存到数据库失败时拒绝,或者在保存到数据库成功时解析:
exports.save_single_item = (itemBody, itemId) => {
return new Promise((resolve, reject) => {
var new_item = new Item(itemBody);
new_item.save(function (err, savedItem) {
if (err)
reject('ERROR');
else {
resolve('OK');
}
});
});
};
对于多个项目,我有一个函数,对于包含项目的提交数组中的每个项目,调用上面的函数。为此,我使用了这个Promise.all构造:
exports.save_multiple_items = (items) => {
var actions = items.map((item) => { module.exports.save_single_item(item, item.id) });
var results = Promise.all(actions);
results.then((savedItems) => {
console.log('ALL OK!');
}).catch((error) => {
console.log('ERROR');
});
};
问题是,我永远不会在results.then.catch上遇到catch块,即使每个promise都调用save_single_item拒绝。它会直接进入then()块,并打印出来#ALL;'。
我得到了UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:9):数组中每个项目的错误,即使我认为(?)在结果中捕获它.then.catch( )块。
我在这里缺少什么?
答案 0 :(得分:3)
您实际上正在生成一个undefined
数组,因为:
var actions = items.map((item) => { module.exports.save_single_item(item, item.id) })
如果你想要一组承诺,你应该删除括号("简洁的函数体"):
var actions = items.map((item) => module.exports.save_single_item(item, item.id))
或者从块中进行显式返回("块函数体"):
var actions = items.map((item) => { return module.exports.save_single_item(item, item.id) })