举个栗子,如果用户在没有登陆的条件下调用接口,那么所有接口都应该返回一个状态码表示用户没有登陆,此时需要跳转到登陆页进行登陆。

但是如果每次调用接口都需要判断一下,代码就会显得十分冗余,因此我们定义了一个apAjax.js,核心代码如下:

const apAjax = (options) => {

// 一些配置代码

return new Promise((resolve, reject) => {

axios({

method: options.method,

url: options.url,

data: options.data,

...

}).then((res) => {

resolve(res)

if(res.code == 401) {

// 跳转到登陆页

}

// 其他代码

}).catch((error) => {

reject(error)

})

})

}

调用

import apAjax from 'apAjax.js'

apAjax(options).then(res => {

// 在这里我们只需要处理接口正常返回的情况即可

// 因为未登陆的情况已经在apAjax.js里面统一处理了

})

看上去代码更加精简了,并且在全局有了统一的错误处理,但是当我们的项目接入sentry日志监控之后,却收到了下图的报错信息

明明在封装的apAjax函数里面进行了catch错误捕获,为什么还会报错呢?

可以看到我们axios函数的then方法里面第一行代码就是resolve(res),这时候Promise的状态已经变成了resolved,这种改变是不可逆的,此时就算后面的其他代码抛出异常,也不会被catch方法捕获到。

另外,Promise对象的错误还有“冒泡”的性质,会一直向后传递,直到被捕获为止。但是上面的调用代码只有then没有catch。(以为被全局统一捕获了,所以没写)最终诞生了这个无家可归的异常。

不仅如此, Promise之间泾渭分明,内部Promise抛出的任何错误,外部Promise对象都无法感知并捕获。 同时,由于promise是异步的,try catch语句也无法捕获其错误。

因此养成良好习惯,不要偷懒,每一个Promise都请记得写上catch。

ajax catch,promise记得写上catch相关推荐

  1. Promise—关于catch(你真的了解catch的执行顺序吗)

    一.问题 今天突然被同事问到一个问题,以下代码怎么输出: Promise.all([new Promise(res => res(0)), new Promise((res, rej) => ...

  2. SpringMvc+ajax实现文件跨域上传

    最近开始学习SpringMVC框架,在学习数据绑定的时候,发现可以使用@RequestParam注解绑定请求数据,实现了文件上传.但是如果一个项目是前后端分离的,前端系统向后端服务上传文件该怎么解决了 ...

  3. 这次彻底搞懂 Promise(手写源码多注释篇)

    作者:一阵风,一枚只想安静写代码的程序员,来自程序员成长指北交流群    github: https://github.com/yizhengfeng-jj/promise 前言 promise 是 ...

  4. 深入理解Promise并写一个符合Promise a+规范的Promise代码

    深入理解Promise并写一个符合Promise a+规范的Promise代码 关于Promise函数可以参考我写的这篇文章https://www.cnblogs.com/qiaohong/p/770 ...

  5. php的注册头像上传,用Ajax实现注册与头像上传功能

    这次给大家带来用Ajax实现注册与头像上传功能,Ajax实现注册与头像上传功能的注意事项有哪些,下面就是实战案例,一起来看一下. 在初次接触ajax后,我们做了一个crm训练的项目,大多数小组都有注册 ...

  6. java catch子句的排列,对于catch子句的排列

    19.在异常处理中,如释放资源.关闭文件.关闭数据库等由( A.try 子句 B.catch 子句 C.finally 子句 D.throw 子句 20.对于 catch 子句的排列,下列哪种是... ...

  7. 求求你别再写上千行的类了,试试这些牛逼的重构技巧吧

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:juejin.cn/post/6844904038383747086 答应我,别再写上千行的类了好吗 最近在对已有项目进行扩展 ...

  8. 答应我!别再写上千行的类了,好吗?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://juejin.im/post/ ...

  9. php文件里直接写上?xml version=1.0 encoding=utf-8?出错?

    因为你的PHP启用了短标签功能,即<?php  ...  ?> 缩写为<? ... ?>,所以当你写上<?xml version="1.0" enco ...

最新文章

  1. 自学web前端的方法都有哪些?新手怎么学HTML5
  2. 计算机在中学物理的应用分析报告,BGPLUS官方合作 | 加州大学伯克利分校 | 物理:计算机算法及物理在工程中应用...
  3. 一个长方体玻璃容器从里面量长宽_泰来包装分享:如何设计钢边箱里面中型木包装箱...
  4. Python MetaClass深入分析
  5. 使用RMAN迁移文件系统数据库到ASM
  6. 文件服务器自动化管理
  7. 处理得怎么样填空词语_武都网络推广软件效果怎么样【易商网络】
  8. 怎么把柱形图和折线图放在一起_excel怎么把柱状图和折线图合并
  9. VS C++项目报错warning C4199: ……use /Zc:twoPhase-
  10. 中国矿业大学(北京)第二届ACM程序设计公开赛(决赛)
  11. 单片机c语言程序编写步骤,Proteus运行Keil编写的51单片机C语言步骤
  12. c语言查表法编程流水灯,通过查表法的流水灯汇编程序
  13. 深度学习和自然语言处理的应用
  14. 大数据就业前景怎么样?hadoop工程师、数据挖掘、数据分析师薪资多少?
  15. ubuntu启动两个mysql_同一台Ubuntu 启动多个mysql
  16. arm_neon.h文件ABI说明
  17. (五)Richardson 迭代法
  18. 书摘---创业36条军规5:如何选择创业方向
  19. Singing Contest
  20. MyBatisPlus查询时报错,Unknow column ‘id‘ in ‘field list‘,怎么解决?

热门文章

  1. python3 struct模块 处理二进制 pack unpack用法
  2. ddos中的tcp反射攻击技术分析
  3. 十种MySQL报错注入
  4. apt-get常用命令
  5. C将十六进制数字字符串转成数字
  6. 频率分布直方图组距如何确定_小猿圈Python开发之绘制频率分布直方图示例
  7. mysql connector bin_mysql-connector-java-xxx-bin.jar包的使用
  8. mysql 按月自动建表
  9. html和css有序列表,HTMLCSS基础学习笔记14—有序列表及列表嵌套
  10. java 视频 缩略图_Java截取视频文件缩略图