jQuery AJAX`always`并非“总是”被称为

时间:2018-08-14 15:57:59

标签: javascript jquery

具体来说,当在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

之类的后续调用堆栈的情况下抛出该异常对象

1 个答案:

答案 0 :(得分:0)

所以,我的猜测是always回调确实(确实)有点误导,并且仅在请求期间 而不是 已经完成了。

似乎deferred.then()会完成任务并在每种情况下都会被调用。但是,这似乎仅在jQuery 3+上有效,这就是为什么我不能发布SO示例(显然限于版本2)的原因。

演示在这里: https://jsfiddle.net/78ux6jhL/

请注意,deferred.then()使用3个回调参数,第一个参数在初始请求成功时,第二个参数在失败时。只需传递两次相同的函数即可模拟您想要的actuallyAlways