我试图理解为什么带有null参数的promise catch仍然获得解析值1
var x = Promise.resolve(1);
var p1 = x.catch(null);
p1.then((x) => {
console.log(x)
}); // logs 1
答案 0 :(得分:1)
x解析时,其值为1 当您尝试捕获x时,它会返回x并添加了catch处理函数,因此p1引用x本身,但带有其他catch处理函数 现在,由于从x继承的p1已被解析,因此链接任何then方法将使用已解析的x参数运行,因此此行为
答案 1 :(得分:1)
它返回1,因为您的代码永远不会到达catch块。要实现它,您必须拒绝您的承诺。甚至是字面(Promise.reject()
)或抛出错误:
示例1:一切正常,没有拒绝:
Promise
.resolve(1)
.then(x => {
console.log(x);
return x + 1;
})
.then(x => {
console.log(x);
return x + 1;
})
.then(x => {
console.log(x);
return x + 1;
})
.catch(e => {
console.log('an error!!'); // block not reached
});
示例2:拒绝承诺跳转到下一个catch块:
Promise
.resolve(1)
.then(x => {
console.log(x);
return x + 1;
})
.then(x => {
console.log(x);
throw Error('ops');
return x + 1;
})
.then(x => { // block not reached
console.log(x);
return x + 1;
})
.catch(e => {
console.log('an error!!');
});
示例3:catch块之后,它可以正常运行:
Promise
.resolve(1)
.then(x => {
console.log(x);
return x + 1;
})
.then(x => {
console.log(x);
throw Error('ops');
return x + 1;
})
.catch(e => {
console.log('an error!!');
return 10;
})
.then(x => {
console.log(x);
return x + 1;
});