[英]jQuery AJAX `always` isn't “always” called
具体来说,当在done
(或fail
)处理程序中引发错误时, always
不会调用always
处理程序。
我已经像这样“修复”了这个问题:
xhr.done(delayThrow(function(response) { /* .. do stuff .. */ }));
function delayThrow(fn) {
return function() {
try {
fn.apply(this,arguments);
} catch(e) {
setTimeout(function() {
throw e;
},10);
}
};
}
这有效,并且(令我惊讶的是)调用堆栈保持不变*。 但这似乎是一个非常棘手的解决方案。 有没有更好的方法,还是我要解决这个错误?
*我认为这是因为已经创建了异常对象,并且该异常对象只是在未考虑诸如setTimeout
类的以后调用堆栈的情况下抛出的
所以,我的猜测是, always
回调(确实)有点误导,只有火灾时,在请求期间发生了错误,而不是之后,它已经完成。
似乎deferred.then()
会完成工作并在每种情况下都会被调用。 但是,这似乎只在jQuery 3+上有效,这就是为什么我不能发布SO示例(显然限于版本2)的原因。
演示在这里: https : //jsfiddle.net/78ux6jhL/
请注意, deferred.then()
3个回调参数,第一个参数在初始请求成功时,第二个参数在失败时。 只是通过相同功能的两次模拟actuallyAlways
你想要的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.