【问题标题】:Promise.all not hitting catch block upon first rejectionPromise.all 在第一次拒绝时未命中 catch 块
【发布时间】: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


【解决方案1】:

您实际上正在生成一个 undefined 数组,因为:

var actions = items.map((item) => { module.exports.save_single_item(item, item.id) })

如果你想要一个promise数组,你应该去掉括号(“简洁的函数体”):

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) })

更多信息在这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Function_body

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 2019-08-31
    • 2019-02-28
    • 2019-10-13
    • 2020-08-03
    • 2018-06-26
    • 2019-01-31
    相关资源
    最近更新 更多