在文档中没有提到它,但显然如果本地AJAX成功处理程序抛出错误,甚至不会调用全局ajaxSuccess处理程序。有没有办法绕过这种机制导致如果你想分发一个JS库或者在ajaxSuccess上做某事的函数,你不一定能控制成功处理程序并确保它不会引发异常。
$(document).ajaxSuccess(function(ev, jqXHR, settings) {
console.log('ajaxSuccess called!'); // does not get called
});
$.ajax({
'url': '/',
'type': 'GET',
'success': function (response) {
console.log('success called!');
throw new Error();
}
});
CodePen:http://codepen.io/anon/pen/Ldybr
答案 0 :(得分:2)
以下documentation部分解释了您所面临的问题:
<强>事件强>
...
成功(本地活动)
只有在请求成功时才会调用此事件(服务器没有错误,数据没有错误)。 ajaxSuccess (全球赛事)
只有在请求成功时才会调用此事件 错误(本地活动)
仅当请求发生错误时才会调用此事件(您不能同时出现错误和带有请求的成功回调)。
ajaxError (全球事件)
此全局事件的行为与本地错误事件相同。
这是正常的事件流,即任何全局事件在 local之后被称为。但是如果任何回调抛出异常,则不会调用其他回调,因为jQuery内部不会在try-catch中包装回调(尽管你可以在回调本地执行此操作)。
正如我在评论中提到的,另一个解决方案是ajax选项的dataFilter属性,它允许您在调用任何本地回调(成功或错误)之前执行所需的操作。以下是我对该问题的评论demo,以防万一:
$.ajaxSetup({
dataFilter: function(data, type) {
console.log('dataFilter called!');
return data;
}
});