reject狀態(tài)傳遞
reject狀態(tài)傳遞途中會跳過成功處理函數(shù)
new Promise((resolve, reject) => {
reject();
})
.then(() => { console.log('1.ok') }) //跳過
.then(() => { console.log('2.ok') }, () => { console.log('2.fail') }) //如果不返回新的Promise,默認會回到成功狀態(tài)
.then(() => { console.log('3.ok') }, () => { console.log('3.fail') });
輸出:
2.fail
3.ok
在then中返回的新Promise中reject也一樣
new Promise((resolve, reject) => {
resolve();
})
.then(() => { console.log('1.ok') })
.then(() => {
return new Promise((resolve, reject) => {
reject();
});
})
.then(() => { console.log('2.ok') }) //跳過
.then(() => { console.log('3.ok') }, () => { console.log('3.fail') });
輸出:
1.ok
3.fail
通過將成功處理函數(shù)置為null插入可選的流程
new Promise((resolve, reject) => {
//登錄后檢查登錄狀態(tài)枉层,若已登錄則resolve模聋,否則reject
console.log('running');
console.log('already logged in');
resolve();
})
.then(null, msg => {
//登錄
console.log('msg: ' + msg);
console.log('login');
})
.then(() => {
//繼續(xù)
console.log('go on');
});
輸出:
running
already logged in
go on
通過reject執(zhí)行可選的流程
new Promise((resolve, reject) => {
//登錄后檢查登錄狀態(tài)偷仿,若已登錄則resolve,否則reject
console.log('running');
reject('not logged in');
})
.then(null, msg => {
//登錄
console.log('msg: ' + msg);
console.log('login');
})
.then(() => {
//繼續(xù)
console.log('go on');
});
輸出:
running
msg: not logged in
login
go on
拋出和處理錯誤
拋出錯誤會觸發(fā)失敗處理函數(shù)西傀,后面的catch捕獲不到
new Promise((resolve, reject) => {
throw new Error('failed');
})
.then(() => { console.log('ok') }, () => { console.log('fail') /*執(zhí)行這里*/ })
.catch(err => {
console.log(err); //捕獲不到
});
輸出:
fail
使用catch捕獲
new Promise((resolve, reject) => {
throw new Error('failed');
})
.then(() => { console.log('ok') }) //沒有失敗處理函數(shù)
.catch(err => {
console.log('error catched: ' + err.message); //執(zhí)行這里
});
輸出:
error catched: failed
不能在回調(diào)函數(shù)里拋出錯誤轮纫,捕獲不到
new Promise(resolve => {
console.log('running');
setTimeout(() => {
console.log('will throw error');
throw new Error('failed');
}, 1000);
})
.catch(err => {
console.log('error catched'); //捕獲不到
});
輸出:
running
will throw error
/Users/Tom/Desktop/Projects/_tests/PromiseTest/main.js:40
throw new Error('failed');
^
Error: failed
at Timeout.setTimeout (/Users/Tom/Desktop/Projects/_tests/PromiseTest/main.js:40:19)
at ontimeout (timers.js:380:14)
at tryOnTimeout (timers.js:244:5)
at Timer.listOnTimeout (timers.js:214:5)