2010-10-25 25 views
11

Tôi đã đi qua nguồn để tìm ra critiera cho các phương thức thành công/thất bại của jQuery.ajax() được gọi. Nó không dựa trên chỉ trên mã trạng thái, dường như nó cũng liên quan đến kiểu dữ liệu.jQuery.ajax() callbacks thành công/thất bại được gọi là khi nào?

Tôi luôn sử dụng trình xử lý lỗi tùy chỉnh bằng cách sử dụng lệnh gọi lại 'hoàn tất'.

Chính xác cái nào là critera cho các cuộc gọi thành công/thất bại?

+0

Dưới đây là ví dụ về cách tạo lỗi tùy chỉnh: http://stackoverflow.com/questions/1637019/how-to-get-the-jquery-ajax-error-response-text – jantimon

Trả lời

10

Như bạn nói, nó phụ thuộc vào kiểu dữ liệu, script là một người đặc biệt ví dụ như việc kiểm tra là:

Đối với các yêu cầu khác đó là kiểm tra như sau:

Lưu ý: Trên đây là dành cho jQuery 1.4.3, jQuery 1.4.2 và dưới đây đã có một "thành công" thêm kịch bản where a response code of 0 was also "successful", điều này đã được thực hiện bởi vì Opera trả về một 0 khi nó thực sự a 304. Đây là hành vi không chính xác và nhóm jQuery đã chọn tham gia drop support for this quirk vì nó đã gây ra các kết quả sai trong các trường hợp mã phản hồi 0 thực tế khác.

+1

Cảm ơn! Câu trả lời rất toàn diện. Việc đặt kiểu dữ liệu thành 'văn bản' sẽ bỏ qua việc phân tích cú pháp phản hồi (do đó có thể loại bỏ 'phân tích cú pháp' có thể)? Nó vẫn mang lại cho tôi parseerror, bất kỳ ý tưởng những gì có thể là anh ta gây ra điều này? – bjornl

+1

@bjornl - Nó kiểm tra tiêu đề loại nội dung và tìm "json" nhiều khả năng, nó sẽ cố phân tích cú pháp nếu có. –

+0

Content-Type được đặt thành 'application/octet-stream' - đó là giao thức REST – bjornl

0

Tôi nghĩ bạn có thể thấy điều này trong đoạn code jquery phù github 394 và trên:

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

Trong phụ thuộc vào mã readyState bạn nhận được chủ yếu và một biến mà nó kiểm soát thời gian chờ:

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; 
} 
} 
}; 
Các vấn đề liên quan