jQuery $.post的always回调中XHR对象返回不一致问题咨询
问题原因及解决办法
这是jQuery Deferred对象回调参数的设计特性导致的,后端操作不会直接修改jQuery里的XHR对象,但后端的响应状态会触发不同的回调参数分支:
- 当请求失败(比如返回422这类错误状态码):
always回调的参数顺序是jqXHR对象, 状态文本, 错误信息 - 当请求成功(返回200这类成功状态码):
always回调的参数顺序是响应数据, 状态文本, jqXHR对象
你的代码只取了第一个参数,所以失败时拿到的是预期的XHR对象,成功时拿到的却是后端返回的响应内容,才会出现控制台里的不一致情况。
修正方案
如果要在always里统一获取jqXHR对象,可以直接取最后一个参数(不管成功还是失败,jqXHR都是最后一个参数):
$.post(url, post).always(function() { const xhr = arguments[arguments.length - 1]; // 始终拿到jqXHR对象 const res = xhr.responseText ? JSON.parse(xhr.responseText) : []; console.log('xhr', xhr); console.log('res', res); });
或者更清晰地分开处理成功和失败场景:
$.post(url, post) .done(function(data, textStatus, xhr) { // 成功逻辑,这里的xhr是jqXHR对象 const res = data || []; console.log('xhr', xhr); console.log('res', res); }) .fail(function(xhr, textStatus, errorThrown) { // 失败逻辑 const res = xhr.responseText ? JSON.parse(xhr.responseText) : []; console.log('xhr', xhr); console.log('res', res); });
内容的提问来源于stack exchange,提问作者clarkk
相关产品推荐
相关产品推荐

