ajaxSuccess / ajaxError与ajaxComplete的jQuery时序

时间:2015-05-08 15:15:21

标签: javascript jquery ajax events

我似乎无法找到明确的答案,而the documentation并没有明确说清楚。

根据我的理解以及other answers提到的内容,全球ajaxComplete事件发生在全球ajaxSuccessajaxError事件之后。

话虽如此,这两组事件之间的时间关系是什么?

  • ajaxComplete / ajaxSuccess启动后,ajaxError只能保证启动吗?
  • ajaxComplete / ajaxSuccess完成后,ajaxError保证会开始吗?
  • 不保证?

作为一些背景知识,我尝试确保我的ajaxComplete处理程序在ajaxSuccess / ajaxError处理程序完成后才会运行。

2 个答案:

答案 0 :(得分:3)

ajaxCompleteajaxSuccess / ajaxError处理程序完成后触发。

这里是jQuery 2.1.4中的相关代码(在jQuery 1.11.3中也是如此):

// Status-dependent callbacks
jqXHR.statusCode( statusCode );
statusCode = undefined;

if ( fireGlobals ) {
    globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
        [ jqXHR, s, isSuccess ? success : error ] );
}

// Complete
completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );

if ( fireGlobals ) {
    globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
    // Handle the global AJAX counter
    if ( !( --jQuery.active ) ) {
        jQuery.event.trigger("ajaxStop");
    }
}

为了验证它,我设置了一个实验,我可以随意指定ajaxSuccess处理程序完成所需的时间。

$(document).ajaxSuccess(function (e, xhr, settings) {
    var startTime = (new Date()).getTime();

    // Intentionally waste an arbitrary length of time
    while ( (new Date()).getTime() - startTime < 1000 ) { }

    var endTime = (new Date()).getTime();
    console.log('ajaxSuccess\n'
              + '    Start: ' + startTime + '\n'
              + '    End:   ' + endTime
    );
});

$(document).ajaxComplete(function (e, xhr, settings) {
    var startTime = (new Date()).getTime();
    console.log('ajaxComplete\n'
              + '    Start: ' + startTime
    );
});

$.get('/');

实验证实了我之前观察到的内容,即ajaxSuccess / ajaxError始终在ajaxComplete开始之前完成,无论花费多长时间。

答案 1 :(得分:0)

找到了here

的文档

来自文档:

  

<强>事件

     

这是Ajax事件的完整列表,以及它们的顺序   被触发。每个都会触发缩进事件   Ajax请求(除非已设置全局选项)。 ajaxStart和   ajaxStop事件是与所有Ajax请求相关的事件。

     
      
  • ajaxStart(全局事件):如果是Ajax,则会触发此事件   请求已启动,当前没有其他Ajax请求正在运行   
        
    • beforeSend(本地事件):此事件在启动Ajax请求之前触发,允许您修改XMLHttpRequest   object(如果需要,设置其他标题。)
    •   
    • ajaxSend(全球   事件):在请求运行之前也会触发此全局事件。
    •   
    • success(本地事件):仅在请求成功时调用此事件(服务器没有错误,数据没有错误)。
    •   
    • ajaxSuccess(全局事件):此事件也仅在调用时调用   请求成功。
    •   
    • error(本地事件):仅当请求发生错误时才会调用此事件(您永远不会同时出现错误和带有请求的成功回调)。
    •   
    • ajaxError(全局事件):此全局事件的行为与本地错误事件相同。
    •   
    • complete(本地事件):无论请求是否成功,都会调用此事件。即使是同步请求,您也将始终收到完整的回调。
    •   
    • ajaxComplete(全局事件):此事件的行为与complete事件相同,并且每次Ajax请求完成时都会触发。
    •   
  •   
  • ajaxStop(全局事件):如果没有更多的Ajax请求被处理,则会触发此全局事件。
  •