调用jQuery ajaxSuccess(或任何全局AJAX事件),即使本地成功(或任何本地AJAX事件)抛出错误

Invoke jQuery ajaxSuccess (or any global AJAX event) even if the local success (or any local AJAX event) throws an error

本文关键字:AJAX 事件 成功 jQuery 任何本 出错 错误 ajaxSuccess 调用 任何全      更新时间:2023-09-26

文档中没有提到,但显然,如果本地AJAX成功处理程序抛出错误,即使全局ajaxSuccess处理程序也不会被调用。有没有办法绕过这个机制,因为如果你想分发一个JS库或util函数在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

以下是部分解释您面临的问题的文档:



success(本地事件)
此事件仅在请求成功时调用(服务器没有错误,数据没有错误)。
ajaxSuccess(全局事件)
此事件也仅在请求成功时调用。
error (Local Event)
此事件仅在请求发生错误时被调用(请求不可能同时发生错误和成功回调)。
ajaxError(全局事件)
此全局事件的行为与本地错误事件相同。

这是正常的事件流,即任何全局事件都在 local之后调用。但是,如果任何回调抛出异常,则不会调用其他回调,因为jQuery内部不会将回调封装在try-catch中(尽管您可以在回调中本地执行此操作)。

正如我在注释中提到的,另一个解决方案是ajax选项的dataFilter属性,它允许您在调用任何本地回调(成功或错误)之前执行所需的操作。下面是我对这个问题的评论,以防万一:

$.ajaxSetup({
  dataFilter: function(data, type) {
    console.log('dataFilter called!');
    return data;
  }
});