我似乎找不到确切的答案,而the documentation并不清楚。

据我了解,以及从other answers所提到的,全局ajaxComplete事件发生在全局ajaxSuccessajaxError事件之后。

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

  • 是否仅保证ajaxComplete / ajaxSuccess启动后才能开始ajaxError
  • 是否保证ajaxComplete / ajaxSuccess完成后就开始ajaxError
  • 没有保证?

  • 作为背景,我试图确保在ajaxComplete / ajaxSuccess处理程序完成之前,我的ajaxError处理程序不会运行。

    最佳答案

    ajaxComplete / ajaxSuccess处理程序的完成完成之后触发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甚至开始之前就完成了,而不管它花了多长时间。

    关于javascript - ajaxSuccess/ajaxError与ajaxComplete的jQuery计时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30127244/

    10-10 20:25