JQuery.ajax() успешные/неудачные обратные вызовы, вызываемые когда?

Я просматривал источник, чтобы узнать критику для jQuery.ajax() методов успеха/отказа, вызываемых. Он не основан исключительно на коде состояния, он также включает тип данных.

Я всегда прибегаю к написанию пользовательских обработчиков ошибок с использованием "полного" обратного вызова.

Точно, какие критерии для вызовов успеха/отказа?

Ответ 1

Как вы сказали, это зависит от типа данных, script является специальным, например:

Для других запросов он проверяет следующее:

Примечание: выше для jQuery 1.4.3, jQuery 1.4.2 и ниже имел дополнительный сценарий "успеха" где код ответа 0 был также "успешным" , это было сделано, потому что Opera возвращает 0, когда это действительно 304. Это неправильное поведение, и команда jQuery выбрала поддержку отбрасывания для этого причуда, поскольку она вызвала ложные срабатывания в другом действительном коде ответа 0 случаев.

Ответ 2

Я думаю, вы можете увидеть это в коде jquery в строке gitub 394 и на:

http://github.com/jquery/jquery/blob/master/src/ajax.js

В зависимости от кода readyState, который вы получаете главным образом, и переменной, где он контролирует таймаут:

var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) {
// The request was aborted
if ( !xhr || xhr.readyState === 0 || isTimeout === "abort" ) {
// Opera doesn't call onreadystatechange before this point
// so we simulate the call
if ( !requestDone ) {
jQuery.handleComplete( s, xhr, status, data );
}

requestDone = true;
if ( xhr ) {
xhr.onreadystatechange = jQuery.noop;
}

// The transfer is complete and the data is available, or the request timed out
} else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) {
requestDone = true;
xhr.onreadystatechange = jQuery.noop;

status = isTimeout === "timeout" ?
"timeout" :
!jQuery.httpSuccess( xhr ) ?
"error" :
s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?
"notmodified" :
"success";

var errMsg;

if ( status === "success" ) {
// Watch for, and catch, XML document parse errors
try {
// process the data (runs the xml through httpData regardless of callback)
data = jQuery.httpData( xhr, s.dataType, s );
} catch( parserError ) {
status = "parsererror";
errMsg = parserError;
}
}

// Make sure that the request was successful or notmodified
if ( status === "success" || status === "notmodified" ) {
// JSONP handles its own success callback
if ( !jsonp ) {
jQuery.handleSuccess( s, xhr, status, data );
}
} else {
jQuery.handleError( s, xhr, status, errMsg );
}

// Fire the complete handlers
if ( !jsonp ) {
jQuery.handleComplete( s, xhr, status, data );
}

if ( isTimeout === "timeout" ) {
xhr.abort();
}

// Stop memory leaks
if ( s.async ) {
xhr = null;
}
}
};