2010-10-25 2 views
11

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

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

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

+0

Вот пример создания пользовательских ошибок: http://stackoverflow.com/questions/1637019/how-to-get-the-jquery-ajax-error-response-text – jantimon

ответ

10

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

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

Примечание: выше для JQuery 1.4.3, JQuery 1.4.2 и ниже имел дополнительный "успех" сценарий where a response code of 0 was also "successful", это было сделано потому, что Opera возвращает 0, когда это действительно a 304. Это неправильное поведение, и команда jQuery выбрала drop support for this quirk, так как она вызвала ложные срабатывания в других действительных случаях кода ответа 0.

+1

Спасибо! Очень полный ответ. Установка типа dataType в «text» должно обойти синтаксический разбор ответа (таким образом, подавляя возможный «parseerror»)? Он все еще дает мне parseerror, любую идею, что может быть причиной этого? – bjornl

+1

@bjornl - он проверяет заголовок типа контента и, скорее всего, находит «json», он попытается проанализировать его, если это так. –

+0

Content-Type установлен в 'application/octet-stream' - это протокол REST – bjornl

0

Я думаю, что вы можете увидеть это в коде Jquery в GitHub линии 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; 
} 
} 
}; 
Смежные вопросы