如果在循环内抛出错误,则中断promise映射

时间:2017-08-11 07:21:35

标签: javascript node.js promise sequelize.js hapijs

我使用Hapi Js和Sequelize对我的API做了一些事情,在这种情况下,我需要先检查一切,然后再进行下一步。

这是我的代码

return promise.map(array, function (values) {
    models.Goods.find({
        where: {
            id: values.id
        }
    }).then(function (res) {
        if (!res || res.length === 0) {
            throw new Error("Item not found");
        }
    });

}).then(function (res) {
    //do something after check
    //next step
}).catch(function(error) {
    console.log(error.message);
});

我需要在下一步之前检查id是否在我的数据库中,但在此代码中如果有任何错误,throw new Error("Item not found");永远不会转到catch function,所以我尝试做得到错误功能的东西。我更改了promise.map中的代码,我在models.Goods中添加了catch函数并且console.log出现了错误,错误显示但promise.map仍在运行并转到{{ 1}}部分而不是停止。

如果//next step

出现错误,请帮我解决promise.map如何中断

谢谢

2 个答案:

答案 0 :(得分:1)

我认为你只是忘了归还模特,这个

return promise.map(array, function (values) {
  models.Goods.find({
    where: {

应该是:

return promise.map(array, function (values) {
  return models.Goods.find({
    where: {

如果使用箭头SO,您可以省略return关键字 这是一个例子,我也加入了一些functions

return promise.map(array, ({id}) => 
    models.Goods.find({
        where: {id}
    }).then(res => {
        if (!res || res.length === 0) {
            throw new Error("Item not found");
        }
    }) // can't have ; here now
).then(res => {
    // do something after check
    // next step
}).catch(error => {
    console.log(error.message);
});

答案 1 :(得分:0)

如果未找到用户,则查询本身成功,因此会触发成功回调。但由于没有与您的查询匹配,因此返回null。这就是为什么它首先不会触发错误。至于第二部分。

您无法捕获使用promises在异步回调函数中抛出的错误,因为它的上下文将丢失。

使用promises,正确的解决方案是拒绝包装承诺。

Promise.reject(new Error('fail')).then(function(error) {
  // not called
}, function(error) {
  console.log(error); // Stacktrace
});