我似乎无法在此找到确定的答案,并且文档并不能完全清楚。
从我的理解以及其他答案中,全局ajaxComplete
事件发生在全局ajaxSuccess
或ajaxError
事件之后。
话虽如此,这两组事件之间的时序关系是什么?
-
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('ajaxSuccessn'
+ ' Start: ' + startTime + 'n'
+ ' End: ' + endTime
);
});
$(document).ajaxComplete(function (e, xhr, settings) {
var startTime = (new Date()).getTime();
console.log('ajaxCompleten'
+ ' Start: ' + startTime
);
});
$.get('/');
实验证实了我以前观察到的内容,即ajaxSuccess
/ajaxError
始终在ajaxComplete
之前完成,无论花了多长时间。
此处找到的文档
来自文档:
事件
这是Ajax事件的完整列表,也是他们的顺序 被触发。缩进事件都是为每一个触发的 AJAX请求(除非设置了全局选项)。Ajaxstart和 AJAXSTOP事件是与所有AJAX请求相关的事件。
- ajaxstart(全局事件):如果AJAX,则触发此事件 启动了请求,目前没有其他AJAX请求。
- beforesend(本地事件):此事件是在启动AJAX请求之前触发的,允许您修改XMLHTTPRequest 对象(如果需要的话,设置其他标题。)
- ajaxsend(全局 事件):在运行请求之前也触发了此全局事件。
- 成功(本地事件):仅当请求成功时才调用此事件(服务器没有错误,数据没有错误)。
- ajaxsuccess(全局事件):仅在此事件时才调用 要求成功。
- 错误(本地事件):仅在请求中发生错误时才调用此事件(您永远不会既有错误,又可以通过请求进行成功回调)。
- ajaxerror(全局事件):此全局事件的行为与本地错误事件相同。
- 完成(本地事件):无论请求是否成功,此事件都被称为。即使是同步请求,您将始终收到完整的回调。
- ajaxcomplete(全局事件):此事件的行为与完整事件相同,并且每次Ajax请求完成时都会触发。
- ajaxstop(全局事件):如果不再处理AJAX请求,则将触发此全局事件。