Javascript jqueryajax`always`不是&x27;";“始终”;打电话

Javascript jqueryajax`always`不是&x27;";“始终”;打电话,javascript,jquery,Javascript,Jquery,具体来说,当在done(或fail)处理程序中抛出错误时,将不调用始终处理程序 我这样“修复”了这个问题: xhr.done(delayThrow(function(response) { /* .. do stuff .. */ })); function delayThrow(fn) { return function() { try { fn.apply(this,arguments); } catch(e) {

具体来说,当在
done
(或
fail
)处理程序中抛出错误时,将不调用
始终
处理程序

我这样“修复”了这个问题:

xhr.done(delayThrow(function(response) { /* .. do stuff .. */ }));

function delayThrow(fn) {
    return function() {
        try {
            fn.apply(this,arguments);
        } catch(e) {
            setTimeout(function() {
                throw e;
            },10);
        }
    };
}
这是可行的,而且(令我惊讶的是)调用堆栈保持不变*。但这似乎是一个非常老套的解决方案。有没有更好的方法,或者我是不是走错了路


*我假设这是因为已经创建了exception对象,只是在没有考虑后续调用堆栈(如
setTimeout

的情况下抛出了它。因此,我猜测
始终
回调(确实)有点误导,只有在请求过程中发生错误时才会触发,而不是在它已经完成之后

好像是在做这项工作,而且每次都会接到电话。然而,这似乎只适用于jQuery3+,这就是为什么我不能发布一个SO示例(显然仅限于版本2)

此处演示:


请注意,
deferred.then()
接受3个回调参数,第一个是在初始请求成功时,第二个是在请求失败时。只需将同一函数传递两次,就可以实际模拟所需的

是否有一个使用
始终
的示例重现您提到的内容?您是否碰巧使用了JSONP请求?@Jeto-在本例中,对
trunt
进行了两次调用,一次调用将在
done
回调中触发错误,另一次则不会。一个没有得到它的
的总是被调用,而一个有错误的没有。