对Promise中的resolve,reject,catch的理
2018-11-05 本文已影响21人
风不会停7
.then()的时候到底是在then什么…
首先要理解…Promise是一个对象,有then()方法的对象
then()的入参是一个函数,通常在promise链中,入参是 一个返回promise的函数 ,这句话好像有点拗口,就是说入参是一个函数,这个函数会return一个promise对象。
如何破坏promise链
如果有这样一个promise链:
p1().then(p2).then(p3)
.then((data) => {
console.log('data: ' + data);
})
.catch((error) => {
console.log('error: ' + error);
});
function p1() {
let p1 = new Promise((resolve, reject) => {
console.log('p1 resolved');
resolve(123);
});
return p1;
}
function p2() {
let p2 = new Promise((resolve, reject) => {
console.log('p2 rejected');
reject(456);
});
return p2;
}
function p3() {
let p3 = new Promise((resolve, reject) => {
console.log('p3 resolved');
resolve(789);
});
return p3;
}
上面这个例子,你看到的console.log会是这样:
p1 resolved
p2 rejected
error: 456
并没有看到 p3 的log,而是看到了error message,也就是说:
在一个promise链中,只要任何一个promise被reject,promise链就被破坏了,reject之后的promise都不会再执行,而是直接调用.catch方法,通过 .catch 能够清楚的判断出promise链在哪个环节出了问题。
//注意
let p = new Promise((resolve, reject) => {
let result = 123;
reject(result);
})
// 只会被第一种方式reject操作失败的结果
p.then((result)=>{
console.log('success:',result);
}, (result)=>{
console.log('fail:',result);
}).then(() => {
console.log(456);
}).catch((result)=>{
console.log('error:',result);
})
//输出结果
// "fail: 123"
// "456"
非Promise链中reject不会影响后面.then()的执行,并且如果reject和catch两种方式同时使用的话,只会被第一种方式reject操作失败的结果。