【发布时间】:2017-05-12 13:15:53
【问题描述】:
我是 Promise 的新手,我正在将多个项目保存到 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');
});
};
问题是,即使对 save_single_item 的每个 promise 调用都被拒绝,我也不会在 results.then.catch 上遇到 catch 块。它直接进入 then() 块并打印出 'ALL OK'。
我收到 UnhandledPromiseRejectionWarning: Unhandled Promise Rejection (rejection id: 9): ERROR for each item in the array,即使我应该(?)在 results.then.catch() 块中捕获它。
我在这里缺少什么?
【问题讨论】:
-
尝试使用
console.log(actions)和console.log(savedItems)。这会让你知道哪里出了问题。当事情没有按预期工作时,一些简单的调试步骤通常会为正在发生的事情提供一些启示。这是一个示例,说明箭头函数是一种更高级的工具,只有完全理解其工作原理的人才能使用。它不仅仅是一个语法快捷方式(这似乎让每个人都想立即使用它)。这是一个更高级的工具,如果使用不当会产生错误。
标签: javascript mongodb promise