2010-05-14 24 views
144

Tôi muốn gặp lỗi và hiển thị thông báo thích hợp nếu yêu cầu Ajax không thành công.Làm cách nào để tôi gặp lỗi đăng truy vấn Ajax?

Mã của tôi giống như sau, nhưng tôi không thể quản lý để nắm bắt yêu cầu Ajax không thành công.

function getAjaxData(id) 
{ 
    $.post("status.ajax.php", {deviceId : id}, function(data){ 

     var tab1; 

     if (data.length>0) { 
      tab1 = data; 
     } 
     else { 
      tab1 = "Error in Ajax"; 
     } 

     return tab1; 
    }); 
} 

Tôi phát hiện ra rằng "Lỗi trong Ajax" không bao giờ được thực thi khi yêu cầu Ajax thất bại.

Làm cách nào để xử lý lỗi Ajax và hiển thị thông báo thích hợp nếu nó không thành công?

Trả lời

175

Kể từ jQuery 1.5, bạn có thể sử dụng các đối tượng cơ chế trì hoãn:

$.post('some.php', {name: 'John'}) 
    .done(function(msg){ }) 
    .fail(function(xhr, status, error) { 
     // error handling 
    }); 

Một cách khác là sử dụng .ajax:

$.ajax({ 
    type: "POST", 
    url: "some.php", 
    data: "name=John&location=Boston", 
    success: function(msg){ 
     alert("Data Saved: " + msg); 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) { 
    alert("some error"); 
    } 
}); 
+14

@Yuck $ .post có thể chấp nhận gọi lại lỗi bằng cách sử dụng các đối tượng hoãn lại. Hãy xem câu trả lời của tôi dưới đây cho một ví dụ. –

+2

Ngoài ra, cách tôi làm cho '$ .ajax' dễ đọc hơn là sử dụng hàm băm cho' dữ liệu' của bạn. Ví dụ: '{name: 'John', vị trí: 'Boston'}' – briangonzalez

+3

Lệnh gọi lại thành công và lỗi trên đã lỗi thời như jQuery 1.8 http://api.jquery.com/jQuery.post/ – Baldy

78
$.ajax({ 
    type: 'POST', 
    url: 'status.ajax.php', 
    data: { 
    deviceId: id 
    }, 
    success: function(data){ 
    // your code from above 
    }, 
    error: function(xhr, textStatus, error){ 
     console.log(xhr.statusText); 
     console.log(textStatus); 
     console.log(error); 
    } 
}); 
10

Một cách đơn giản là thực hiện ajaxError:

Bất cứ khi nào một n Yêu cầu Ajax hoàn thành có lỗi, jQuery kích hoạt sự kiện ajaxError. Bất kỳ và tất cả các trình xử lý đã được đăng ký với phương thức .ajaxError() được thực hiện tại lần này.

Ví dụ:

$('.log').ajaxError(function() { 
    $(this).text('Triggered ajaxError handler.'); 
}); 

tôi sẽ khuyên bạn nên đọc tài liệu ajaxError. Nó thực hiện hơn so với trường hợp sử dụng đơn giản trình bày ở trên - chủ yếu là gọi lại nó chấp nhận một số thông số:

$('.log').ajaxError(function(e, xhr, settings, exception) { 
    if (settings.url == 'ajax/missing.html') { 
    $(this).text('Triggered ajaxError handler.'); 
    } 
}); 
+1

+1 - Tôi sẽ thêm rằng trình xử lý này nhận được một số đối số, vì vậy bạn có thể hiển thị lỗi thực, mã phản hồi, url, v.v. –

+0

@Nick - đã thêm vào đó. – karim79

+0

Tuyệt vời ... nhưng bạn không thể nhận được +2 trong số tôi! :) –

244

jQuery 1.5 thêm đối tượng thu nhập hoãn lại có thể xử lý độc đáo này. Chỉ cần gọi $.post và đính kèm bất kỳ trình xử lý nào bạn muốn sau cuộc gọi. Các đối tượng trì hoãn thậm chí cho phép bạn đính kèm nhiều trình xử lý lỗi và thành công.

Ví dụ:

$.post('status.ajax.php', {deviceId: id}) 
    .done(function(msg) { ... }) 
    .fail(function(xhr, textStatus, errorThrown) { 
     alert(xhr.responseText); 
    }); 

Trước jQuery 1.8, chức năng done được gọi successfail được gọi error.

+3

+1 Rất đẹp, nhưng vẫn không điên về cú pháp. Hy vọng rằng nó được thống nhất trong một bản phát hành trong tương lai. – Yuck

+19

Đây phải là câu trả lời được chấp nhận. Câu trả lời được chấp nhận hiện tại là "sử dụng một phương pháp khác"; câu trả lời này nói "đây là cách làm cho phương thức của bạn hoạt động". Cái sau thường được ưu tiên trên SO. Trên thực tế, điều này nên được bao gồm trong tài liệu $ .post !!! –

+2

http://api.jquery.com/deferred.fail, http://api.jquery.com/deferred.done cho tài liệu – Deleplace

12
$.post('someUri', { }, 
    function(data){ doSomeStuff }) 
.fail(function(error) { alert(error.responseJSON) }); 
+2

Giải thích thêm một chút ở đây sẽ giúp người đọc trong tương lai. –

+0

nếu tôi có lỗi không xác định thì sao? – Muflix

1

Tôi đã khắc phục sự cố này bằng cách khai báo datatype: 'json' trong cuộc gọi jQuery ajax của tôi.

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