• 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
                    })
                
                
                
  • 相关阅读:
    Cake
    抽屉评论数据库设计
    学习网站
    栈和堆简介
    链表相关操作
    链表操作
    Django form验证二
    django ajax提交form表单数据
    jquery中 after append appendTo 的区别
    Python json.dumps 自定义序列化操作
  • 原文地址:https://www.cnblogs.com/rickdiculous/p/13296753.html
Copyright © 2020-2023  润新知