promise碰到then,也就是resolve或者reject的時候是異步的,所以try...catch對它是沒有用的
1、then(resolve,reject); then方法中第二個回調,是失敗時候做的失敗時候做的事
function f(val){ return new Promise((resolve,reject) => { if(val){ resolve({ name:'小明' },100); //成功時也可以傳遞一個值,但需要注意的是只能傳遞一個參數,傳兩個的話第二個參數是拿不到的 }else{ reject('404'); //錯誤處理的第一種方式:傳遞參數,錯誤的原因 } }); } //then(resolve,reject),碰到resolve或是reject都是異步的,所以tr catch對它是沒有用的 //then方法中的第二個回調reject,是失敗時候做的事 f(false) .then( (data, data2) => { console.log(data2); //undefined }, e => { console.log(e); //404 })
//需要注意的是只能傳遞一個參數,如果傳遞了兩個參數,第二個參數是拿不到的,data2會為undefined
f(true)
.then( (data,data2) => {
console.log(data2); //打印結果為undefined
},e => {
console.log(e);
})
2、使用catch捕獲錯誤
function f(val){ return new Promise((resolve,reject) => { if(val){ resolve({ name:'小明' }); }else{ reject('404'); } }); } f(true) .then(data => { console.log(data); //{name:'小明'} return f(false); //返回的promise是失敗的話,后面的then對這個失敗沒有處理的話,就會繼續往下走 }) .then(() => { console.log('我永遠不會被輸出') }) .then(() => { }, e => console.log('失敗')) // .catch(e => { //上面處理了錯誤的話,這個catch就不會運行了 console.log(e); //404 }) .then( () => { //catch后面可以繼續then,但是如果后面的then出錯了,跟上一個catch就沒有關系了 console.log(e) return f(false) }) .catch() //如果最后一個catch有錯誤,會無限catch //標准es中,這個問題沒有很好地解決方法,但是第三方的庫有對全局的捕獲
3、finally捕獲
//finally //不論成功還是失敗,finally中的內容一定會執行 //可以在finally中做一些收尾的工作 function f(val){ return new Promise((resolve,reject) => { if(val){ resolve({ name:'小明' }); }else{ reject('404'); } }); } f(true) .then(data => { console.log(data); //{name:'小明'} return f(false); }) .catch(e => { console.log(e) //404 return f(false); //即便返回了一個成功的promise,下面的finally也會執行,如果返回的是失敗的promise,控制台最后一行會報錯uncaught (in promise) 404 }) .finally( () => { console.log(100) //100 })