Javascript承诺"然后"即使承诺未能执行,也始终运行

时间:2017-12-11 14:39:19

标签: javascript promise deferred

我想要第三个"然后"当第二个"然后"叫做。然而,它仍然称为第三个"然后"即使承诺被拒绝(第二个"然后"被调用),代码返回"拒绝"然后" undefined"。如何不运行第三个"然后"所以" undefined"不会出现?

var FirstPromise = function() {

  let promiseme = new Promise(function(res, rej) {

    if ('a' == 'b') {
      res(1);
    } else {
      rej('rejected');
    }
  })

  return promiseme;
};

function succeddcallback(msg) {
  return msg * 2;
}

function errorcallback(msg) {
  console.log(msg);
}

FirstPromise()
  .then(succeddcallback, null)
  .then(null, errorcallback)
  .then(function(succedded) {
    console.log(succedded);
  }, function(failed) {
    console.log(failed);
  })

1 个答案:

答案 0 :(得分:4)

那是因为您在catch语句中发现了错误 - 即.then(null,errorcallback) - 并且您从未抛出其他错误或在其中返回被拒绝的承诺。

...这与返回未定义值的已解析promise相同,这就是下一个.then执行成功回调的原因。

如果您希望将错误传播到后续.catch.then(null,fn),那么您的errorcallback必须抛出(或返回被拒绝的承诺):

function errorcallback(msg) {
  console.log(msg);
  throw new Error(msg); //or (return Promise.reject(msg);
}

请记住,在每个.catch(或.then(null,fn)你必须重新抛出(或返回被拒绝的承诺),以便后续的错误回调被调用。