Promise的catch方法,是不是一定要把错误信息打印出来?

// 常见的promise使用例子
var promise1 = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('foo');
  }, 300);
});
promise1
    .then(data => {
        // 处理正常业务逻辑
        var a = null
        a.b = 3
    })
    .catch(error => {
        // 处理异常
    })

上面是常见的promise使用例子,当promise1进入到reject状态时,catch会捕捉到,并进行异常处理;

但业务逻辑产生不可预知的错误时,也会被catch捕捉,如果不被特殊判断的话,就会按照reject状态一同被处理。

由于项目中使用的是axios进行数据请求,因此写了上千个axios的Promise实例。如果每一个catch都要判断error类型并单独处理的话,感觉特别浪费代码且不方便。有什么更好地解决办法吗?

阅读 6.9k
4 个回答

你可以把同类型的错误处理写成一个重用的公共的函数或者方法,然后在每个请求的catch中调用这个函数。

  1. 逻辑的更改,变动尽量不要放在 promise 的 then 里,可以调用函数,在函数里try catch;
  2. 使用typescript,可大大减少基本逻辑的错误;

首先Promise就不多说了,你能使用上述代码,说明已经很熟悉了(简单提一句,如果有必要catch是可以不写的)
针对你提到的异常处理多说一点吧
排除前后端代码本身有问题的情况下,后台接口一般会返回接口状态码(注意,不是http的状态码),一般情况下200为正常,那反过来说除了200都是异常
这里有两种操作
1.无论接口状态码是多少,后台都会把状态和描述返回(不讨论接口本身报错的情况,比如http状态码为500+),这个时候对前端来说,收到的http状态都会是200,那么我们的catch永远都不会回调(简单的说可以不写catch)
2.接口只会将接口状态码为200的返回正确,其他的直接抛异常,这个时候前端then内回调的全是正常数据,异常全在catch内,如果这些异常数据不展示给用户看的情况下,catch也可以不写

总结一下,根据自己团队习惯灵活处理自己的代码才是合适的

  1. 应该把错误显示出来,告知用户,这样用户才好进行下一步操作,你们也好 debug。
  2. axios 可以加拦截器 interceptor,你可以在拦截器里处理一部分通用错误,比如 401、404、504 等。
  3. 实际上 axios 可以当单例来用,不需要反复创建实例。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题