具体来说,当在done
(或fail
)处理程序中引发错误时,根本不会调用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
答案 0 :(得分:0)
所以,我的猜测是always
回调确实(确实)有点误导,并且仅在请求期间 而不是 已经完成了。
似乎deferred.then()
会完成任务并在每种情况下都会被调用。但是,这似乎仅在jQuery 3+上有效,这就是为什么我不能发布SO示例(显然限于版本2)的原因。
演示在这里: https://jsfiddle.net/78ux6jhL/
请注意,deferred.then()
使用3个回调参数,第一个参数在初始请求成功时,第二个参数在失败时。只需传递两次相同的函数即可模拟您想要的actuallyAlways
。