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 @   是桂  阅读(12831)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示