Làm cách nào để bắt lỗi bài truy vấn Ajax?


209

Tôi muốn bắt lỗi và hiển thị thông báo phù hợp nếu yêu cầu Ajax không thành công.

Mã của tôi giống như sau, nhưng tôi không thể quản lý để bắt được 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 không thành công.

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

Câu trả lời:


304

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

$.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 bị trì hoãn. Hãy xem câu trả lời của tôi dưới đây cho một ví dụ.
Michael Venable

2
Ngoài ra, cách để tôi $.ajaxdễ đọc hơn là sử dụng hàm băm cho bạn data. Ví dụ:{ name : 'John', location: 'Boston' }
briangonzalez

3
Các cuộc gọi lại thành công và lỗi ở trên đã lỗi thời kể từ jQuery 1.8 api.jquery.com/jQuery.post
Baldy

@MichaelVeneble tôi nghĩ bạn có thể sử dụng$.post().error()
clintgh

288

jQuery 1.5 đã thêm các đối tượng hoãn lại xử lý việc này độc đáo. Chỉ cần gọi $.postvà đí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 bị 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.

Thí dụ:

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

Trước jQuery 1.8, hàm doneđã được gọi successfailđược gọi error.


3
+1 Rất hay, nhưng vẫn không điên về cú pháp. Hy vọng nó sẽ được thống nhất trong một phiên bản tương lai.
Yuck

25
Đâ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 nay là "sử dụng một phương pháp khác"; câu trả lời này cho biết "đây là cách làm cho phương pháp của bạn hoạt động". Thứ hai thường được ưa thích trên SO. Trên thực tế, điều này nên được bao gồm trong tài liệu $ .post !!!
Đánh dấu E. Haase


Nhân tiện, đó cũng là responseJSONtài sản cũng rất tiện dụng trong trường hợp loại ajax json.
ivkremer

91
$.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);
  }
});

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

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

13

Một cách đơn giản là triển khai ajaxError :

Bất cứ khi nào một yêu cầu Ajax hoàn thành với một lỗi, jQuery sẽ 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 () đều được thực thi tại thời điểm này.

Ví dụ:

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

Tôi sẽ đề nghị đọc tài liệu ajaxError . Nó thực hiện nhiều hơn trường hợp sử dụng đơn giản được trình bày ở trên - chủ yếu là cuộc gọi lại của nó chấp nhận một số tham 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 tế, mã phản hồi, url, v.v.
Nick Craver

Lưu ý rằng kể từ jQuery 1.8, phương thức .ajaxError () chỉ nên được đính kèm vào tài liệu.
Nanki

0

Bạn phải đăng nhập answerText:

$.ajax({
    type: 'POST',
    url: 'status.ajax.php',
    data: {
    deviceId: id
  }
})
.done(
 function (data) {
  //your code
 }
)
.fail(function (data) {
      console.log( "Ajax failed: " + data['responseText'] );
})

0

bạn đính kèm trình xử lý .onerror vào đối tượng ajax, tại sao mọi người cứ khăng khăng đăng JQuery để trả lời khi vanila hoạt động đa nền tảng ...

ví dụ nhanh chóng:

ajax = new XMLHttpRequest();
ajax.open( "POST", "/url/to/handler.php", true );
ajax.onerror = function(){
    alert("Oops! Something went wrong...");
}
ajax.send(someWebFormToken );
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.