Promise.all在第一次拒绝时没有碰到阻挡

时间:2017-05-12 13:15:54

标签: javascript mongodb 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');

  });
};

问题是,我永远不会在results.then.catch上遇到catch块,即使每个promise都调用save_single_item拒绝。它会直接进入then()块,并打印出来#ALL;'。

我得到了UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:9):数组中每个项目的错误,即使我认为(?)在结果中捕获它.then.catch( )块。

我在这里缺少什么?

1 个答案:

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

此处有更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Function_body