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

 

posted @ 2020-07-14 00:10  是桂  阅读(12598)  评论(0编辑  收藏  举报