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

时间:2014-08-22 07:32:42

标签: javascript jquery ajax

在文档中没有提到它,但显然如果本地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

1 个答案:

答案 0 :(得分:2)

以下documentation部分解释了您所面临的问题:

  

<强>事件
  ...
  成功(本地活动)
  只有在请求成功时才会调用此事件(服务器没有错误,数据没有错误)。    ajaxSuccess (全球赛事)
  只有在请求成功时才会调用此事件   错误(本地活动)
  仅当请求发生错误时才会调用此事件(您不能同时出现错误和带有请求的成功回调)。
   ajaxError (全球事件)
  此全局事件的行为与本地错误事件相同。

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

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

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