为什么Promise's然后&捕获回调被调用?

时间:2016-10-16 11:16:49

标签: javascript ecmascript-6 es6-promise

我有以下代码,当它执行时,它会返回“已拒绝”和“成功”:

// javascript promise
var promise = new Promise(function(resolve, reject){
  setTimeout(function(){reject()}, 1000)
});
promise
  .catch(function(){console.log('rejected')})
  .then(function(){console.log('success')});

有人可以解释为什么要记录成功?

5 个答案:

答案 0 :(得分:11)

then回调被调用,因为catch回调在它之前,而不是之后。拒绝已由catch处理。如果您更改顺序(即(promise.then(...).catch(...))),则不会执行then回调。

MDN表示.catch()方法“返回一个解决回调返回值的新承诺”。您的catch回调函数不返回任何内容,因此使用undefined值解析承诺。

答案 1 :(得分:9)

  

有人可以解释为什么会记录成功吗?

简而言之:.then链中.catch之后的Promise将始终执行(除非它本身包含错误)。

理论解释

您的代码实际上只是一个Promise链,首先执行同步,然后将其设置为异步完成 。 Javascript引擎会将任意reject()Error传递给链中的第一个.then,其中包含reject回调。拒绝回调是传递给.then的第二个函数:

.then(
function (){
    //handle success
},
function () {
    //handle reject() and Error
})

使用.catch只是语法上的:

.then(null, function () {
    //handle reject() or Error
})

.then中的每一个都会自动返回一个新的Promise,后续.then的{​​{1}}(或.catch)也会.then。 1}}的)。

可视化您的承诺链的流程

您可以使用以下示例可视化代码流:

var step1 = new Promise (function (resolve, reject) {

  setTimeout(reject('error in step1'), 1000);
})

var step2 = step1.then(null, function () {

  // do some error handling
  return 'done handling errors'
})

var step3 = step2.then(function () {

  // do some other stuff after error handling
  return 'done doing other stuff'
}, null)

setTimeout (function () {

console.log ('step1: ', step1);
console.log ('step2: ', step2);
console.log ('step3: ', step3);

console.log();
console.log ('Asynchronous code completed')
console.log();
}, 2000);

console.log ('step1: ', step1);
console.log ('step2: ', step2);
console.log ('step3: ', step3);

console.log();
console.log ('Synchronous code completed')
console.log();

在运行时将在控制台中产生以下输出:

step1:  Promise { <rejected> 'error in step1' }
step2:  Promise { <pending> }
step3:  Promise { <pending> }

Synchronous code completed

step1:  Promise { <rejected> 'error in step1' }
step2:  Promise { 'done handling errors' }
step3:  Promise { 'done doing other stuff' }

Asynchronous code completed

答案 2 :(得分:0)

对于那些已经成功解决了诺言并且订购了 for (var i = 0; i < imgArray.length; i++) { var img = $('<img />', { id: 'images' + i, src: imgArray[i], }); img.appendTo($('#imagediv')); } > .then之类的连锁店,但仍将您的.catchthen都叫来的人,可能是因为您的catch有一个抛出错误的错误,除非您在then 中明确控制该错误,否则您将看不到该错误。那是我的“宠爱者”之一,即使在严格模式下也承诺会吸收错误。

catch

答案 3 :(得分:0)

对我来说,catch()是在成功的诺言之后被召唤的,.then()中没有错误。

原因是,我听了一个随着成功的诺言而变化的值,并运行了一个方法。

此方法引发了一个无提示的错误,因为它被视为promise的一部分。

答案 4 :(得分:0)

类似于@Timar,对我来说,调用 catch 的原因是“then”包含异常代码。所以在正常执行“then”之后,当它到达异常代码时,它会在“catch”xD中处理异常