jQuery ajaxSetup beforeSend回调中无法读取xhr.status属性问题
问题成因
- 回调钩子用错了:
beforeSend会在Ajax请求正式发送前执行,触发这个回调时HTTP请求还没发到后端,完全没拿到响应内容。此时XMLHttpRequest实例刚完成初始化,status属性还未被赋值,直接读取自然返回undefined。 - 控制台打印对象的显示误差:当你通过
console.log(xhr)打印整个xhr对象时,浏览器控制台不会立刻保存对象的快照,而是在你手动展开控制台里的对象条目时,才去读取对象的当前属性值——等你点开看的时候,请求早就已经完成,xhr对象已经更新为响应结束后的最终状态,所以你能看到status:401,但这个值根本不是beforeSend执行当下的属性值。
修复方案
把状态判断逻辑从beforeSend移到响应返回后触发的全局钩子中,推荐两种写法,都不需要修改单个Ajax请求:
- 用jQuery内置的
statusCode配置做统一状态码匹配,是最简洁的方案:
$.ajaxSetup({ statusCode: { 401: () => { window.location.replace(_baseUrl); } } });
- 如果需要在判断状态前加其他通用逻辑,可以用
complete回调,这个回调会在所有请求(无论成功失败)拿到响应后执行:
$.ajaxSetup({ complete: (xhr) => { if (xhr.status === 401) { window.location.replace(_baseUrl); } } });
注意:不要在全局配置里用
success/error回调做拦截,部分jQuery版本中如果单个Ajax请求单独定义了success/error处理,全局配置的同类型回调会被覆盖,无法触发。statusCode和complete不存在这个问题,能保证所有请求的401状态都被捕获。
内容的提问来源于stack exchange,提问作者Jolan
相关产品推荐
相关产品推荐

