promise錯誤處理的三種方法


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
                })
            
            
            

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM