2012-03-22 34 views
8

Đối tượng jqXHR của jQuery được chuyển đến cuộc gọi lại không thành công không phân tích các câu trả lời của json, do đó responseJSON không có sẵn responseText.jquery ajax không phân tích cú pháp json trên thất bại

Nó hoạt động tốt cho các yêu cầu thành công, tôi đang thiết lập các tiêu đề chính xác sử dụng dataType: 'json'

Gọi:

$.ajax({ 
    type: 'POST', 
    url: $form.attr('action'), 
    data: post_data, 
    dataType: 'json', 
    done: done_callback, 
    fail: fail_callback, 
    always: always_callback 
    }); 

Request Headers:

Accept:application/json, text/javascript, */*; q=0.01 
X-Requested-With:XMLHttpRequest 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.83 Safari/535.11 

Tiêu đề phản hồi:

Content-Type:application/json;charset=utf-8 
Status:500 
.210

responseText:

{"status":"error","code":500,"message":"A system error occurred, please try again later"} 

responseJSON là undefined

Đó có phải là trường hợp đó jQuery không phân tích json khi đáp ứng với yêu cầu ajax không thành công? tôi không thể tìm thấy bất kỳ tài liệu hướng dẫn để xác nhận hoặc phủ nhận hành vi này (Tôi có thể chỉ là không nhìn cứng đủ)

tôi có thể rõ ràng là chỉ cần sử dụng parseJSON trong fail gọi lại.

+2

Bạn nói đúng. Nội dung phản hồi không phải là 'eval'ed do lỗi. Nếu bạn nhận được JSON trên 500 lỗi, bạn chỉ cần phân tích cú pháp đó. – Strelok

+1

có. @ Khởi động khá đúng chỉ cho tôi dòng chính xác mà jquery đã đưa ra quyết định này không để vượt qua các phản ứng thông qua các loại chuyển đổi. – Rob

Trả lời

12

tôi đã có một cái nhìn vào jQuery phương pháp ajax callback. Nó chỉ chuyển đổi kiểu dữ liệu nếu (status >= 200 && status < 300 || status === 304) là true nếu không thì đáp ứng được truyền cho trình xử lý tương ứng. Đó là nếu yêu cầu là một thất bại thì phản hồi sẽ không được phân tích theo kiểu dữ liệu dự kiến.

Nếu bạn muốn biết thêm thông tin, bạn có thể tìm trạng thái trên trong tệp jquery.js và xem nó hoạt động.

+1

Thật vậy, bạn đang phát hiện ra.Bạn có bất kỳ ý tưởng tại sao jquery có mã hóa đặc biệt này, có vẻ rất lạ, dữ liệu phản hồi là hợp lệ ngay cả đối với các lỗi. HTTP1.1 nói "Ngoại trừ khi trả lời yêu cầu HEAD, máy chủ nên bao gồm một thực thể có chứa giải thích về tình huống lỗi" – Rob

+0

Tôi nghĩ rằng đó là vì họ giả định rằng nếu yêu cầu thất bại thì nội dung phản hồi có thể không đáng tin cậy –

+1

Điều này không còn đúng: http://bugs.jquery.com/ticket/13917#comment:2 "* Theo cam kết này: […] đã phân tích cú pháp JSON có sẵn trong trường hợp lỗi như trường responseJSON của cá thể jqXHR . * " – Ashe

0

Tôi đoán những gì bạn đang tìm kiếm là data.statusdata.statusText

+1

đối tượng "dữ liệu" không được chuyển đến lỗi gọi lại, chỉ thành công, tôi muốn json của tôi là đối tượng – Rob

+0

Điều đó sẽ là mới đối với tôi, ứng dụng tôi xây dựng trong thời điểm webapp với vòng khoảng 100 cuộc gọi ajax và tôi sử dụng mọi cảnh báo lỗi: chức năng (dữ liệu) {oneduy nhất ("dữ liệu:" + data.status + "" + data.statusText); } 'Tôi không có vấn đề gì với nó –

+1

data.statusText chính xác là văn bản được xác định bởi HTTP1.1 trong trường hợp của tôi "Lỗi Máy chủ Nội bộ", đây không phải là những gì tôi muốn, tôi muốn đối tượng phản hồi thực tế sau khi loại chuỗi, chứ không phải XHR đối tượng, giống như bạn nhận được trong một cuộc gọi lại thành công. ví dụ. '{error:" error ", status: 500, message:" Chúng tôi không thể nhận được tin nhắn của bạn ngay bây giờ. "}' – Rob

1

Kể từ phiên bản 1.5 của jQuery có statusCode handler thêm:

$.ajax({ 
    statusCode: { 
    404: function() { 
     alert("page not found"); 
    } 
    } 
}); 

Tuy nhiên trong các phiên bản trước đó bạn nên phân tích các văn bản phản ứng riêng biệt khi tình trạng lỗi được trả về:

$.ajax({ 
    success: function(response) { 
    data = $.evalJSON(response); 
    alert(data); 
    }, 
    error: function(response) { 
    data = $.evalJSON(response.responseText); 
    alert(data); 
    } 
}); 
+0

Tôi nghĩ rằng các chức năng bản địa là parseJSON không evalJSON, tôi nhận được:" evalJSON không phải là một chức năng "bằng cách sử dụng jQuery 1.11.0 –

Các vấn đề liên quan