.then()的時(shí)候到底是在then什么…
首先要理解…Promise是一個(gè)對(duì)象喷好,有then()方法的對(duì)象
then()的入?yún)⑹且粋€(gè)函數(shù),通常在promise鏈中读跷,入?yún)⑹?一個(gè)返回promise的函數(shù) 梗搅,這句話好像有點(diǎn)拗口,就是說(shuō)入?yún)⑹且粋€(gè)函數(shù)效览,這個(gè)函數(shù)會(huì)return一個(gè)promise對(duì)象无切。
如何破壞promise鏈
如果有這樣一個(gè)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;
}
上面這個(gè)例子,你看到的console.log會(huì)是這樣:
p1 resolved
p2 rejected
error: 456
并沒(méi)有看到 p3 的log钦铺,而是看到了error message订雾,也就是說(shuō):
在一個(gè)promise鏈中,只要任何一個(gè)promise被reject矛洞,promise鏈就被破壞了洼哎,reject之后的promise都不會(huì)再執(zhí)行,而是直接調(diào)用.catch方法沼本,通過(guò) .catch 能夠清楚的判斷出promise鏈在哪個(gè)環(huán)節(jié)出了問(wèn)題噩峦。
//注意
let p = new Promise((resolve, reject) => {
let result = 123;
reject(result);
})
// 只會(huì)被第一種方式reject操作失敗的結(jié)果
p.then((result)=>{
console.log('success:',result);
}, (result)=>{
console.log('fail:',result);
}).then(() => {
console.log(456);
}).catch((result)=>{
console.log('error:',result);
})
//輸出結(jié)果
// "fail: 123"
// "456"
非Promise鏈中reject不會(huì)影響后面.then()的執(zhí)行,并且如果reject和catch兩種方式同時(shí)使用的話抽兆,只會(huì)被第一種方式reject操作失敗的結(jié)果识补。