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
回调中触发错误,另一次则不会。一个没有得到它的的总是被调用,而一个有错误的没有。