我应该在嵌套的承诺上调用.catch吗?

时间:2017-10-10 18:18:42

标签: node.js es6-promise

我被问到.catch处理的承诺,现在我很好奇我是否正确。我相信,在下面的代码中,如果内部承诺中存在错误,那么它将被我在调用承诺上的.catch捕获。我被问到的问题让我怀疑我的理解,虽然我不认为我应该有一个嵌套的捕获,但我不确定替代解决方案是什么。我在节点FYI中使用本机承诺。

  promise1(param1)
    .then((status) => {
      if (status !== 200) {
        return 'Error!';
      }
      promise2(param1, param2)//param2 defined out of this scope
        .then((result) => {
          return 'Yay, result!';
        })
    })
    .catch((error) => {
      return JSON.stringify({'Caught Error': error});
    })

我曾经考虑过做这样的事情但是promise2需要第二个参数:

  promise1(param1)
    .then((status) => {
      if (status !== 200) {
        return 'Error!';
      }
      return param1;
    })
    .then(promise2)
    .catch((error) => {
      return JSON.stringify({'Caught Error': error});
    })

那么,问题呢? promise2应该有.catch,还是promise1 .catch会发现错误?如果我错了,有什么更好的办法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

  

我相信,在下面的代码中,如果内部承诺中存在错误,那么它将被调用承诺上的.catch捕获。

没有。 catch只会处理对其被调用的承诺的拒绝。

你可以(并且应该)然后让这个承诺与内部承诺一起解决,并且当内部承诺拒绝时拒绝,并通过返回承诺来拒绝then回调。

promise1(param1).then(status => {
  if (status !== 200) {
    return 'Error!';
  }
  return promise2(param1, param2);
//^^^^^^
})
.then(result => { // you can unnest this now
  return 'Yay, result!';
})
.catch((error) => {
  return JSON.stringify({'Caught Error': error});
})