我有以下代码,当它执行时,它会返回“已拒绝”和“成功”:
// javascript promise
var promise = new Promise(function(resolve, reject){
setTimeout(function(){reject()}, 1000)
});
promise
.catch(function(){console.log('rejected')})
.then(function(){console.log('success')});
有人可以解释为什么要记录成功?
答案 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
之类的连锁店,但仍将您的.catch
和then
都叫来的人,可能是因为您的catch
有一个抛出错误的错误,除非您在then
中明确控制该错误,否则您将看不到该错误。那是我的“宠爱者”之一,即使在严格模式下也承诺会吸收错误。
catch
答案 3 :(得分:0)
对我来说,catch()
是在成功的诺言之后被召唤的,.then()
中没有错误。
原因是,我听了一个随着成功的诺言而变化的值,并运行了一个方法。
此方法引发了一个无提示的错误,因为它被视为promise的一部分。
答案 4 :(得分:0)
类似于@Timar,对我来说,调用 catch 的原因是“then”包含异常代码。所以在正常执行“then”之后,当它到达异常代码时,它会在“catch”xD中处理异常