ฉันจะจับข้อผิดพลาดการโพสต์ข้อความค้นหา Ajax ได้อย่างไร


209

ฉันต้องการตรวจจับข้อผิดพลาดและแสดงข้อความที่เหมาะสมหากคำขอ Ajax ล้มเหลว

รหัสของฉันเป็นดังต่อไปนี้ แต่ฉันไม่สามารถจัดการกับคำขอ Ajax ที่ล้มเหลวได้

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;
    });
}

ฉันพบว่า "Error in Ajax" ไม่เคยถูกดำเนินการเมื่อคำขอ Ajax ล้มเหลว

ฉันจะจัดการข้อผิดพลาด Ajax และแสดงข้อความที่เหมาะสมได้อย่างไรหากล้มเหลว

คำตอบ:


304

ตั้งแต่ jQuery 1.5 คุณสามารถใช้กลไกวัตถุที่เลื่อนออกไป:

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

วิธีอื่นใช้.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 สามารถยอมรับข้อผิดพลาดในการโทรกลับโดยใช้วัตถุที่ถูกเลื่อนออกไป ลองดูคำตอบของฉันด้านล่างเพื่อดูตัวอย่าง
Michael Venable

2
นอกจากนี้ผมวิธีที่จะทำให้อ่านได้มากขึ้นคือการใช้กัญชาสำหรับคุณ$.ajax dataตัวอย่างเช่น:{ name : 'John', location: 'Boston' }
briangonzalez

3
ความสำเร็จและข้อผิดพลาดในการโทรกลับด้านบนล้าสมัยตั้งแต่ jQuery 1.8 api.jquery.com/jQuery.post
Baldy

@MichaelVeneble ฉันคิดว่าคุณสามารถใช้$.post().error()
clintgh

288

jQuery 1.5 ได้เพิ่มวัตถุรอการตัดบัญชีที่จัดการสิ่งนี้ได้อย่างดี เพียงแค่โทร$.postและแนบตัวจัดการใด ๆ ที่คุณต้องการหลังจากการโทร วัตถุที่เลื่อนออกไปยังอนุญาตให้คุณแนบหลายตัวจัดการข้อผิดพลาดและประสบความสำเร็จ

ตัวอย่าง:

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

ก่อนหน้า jQuery 1.8 ฟังก์ชันdoneถูกเรียกใช้successและfailถูกเรียกerrorใช้


3
+1 ดีมาก แต่ก็ยังไม่ได้บ้าเกี่ยวกับไวยากรณ์ หวังว่ามันจะรวมเป็นหนึ่งเดียวในอนาคต
Yuck

25
นี่ควรเป็นคำตอบที่ยอมรับได้ คำตอบที่ยอมรับในปัจจุบันคือ "ใช้วิธีอื่น"; คำตอบนี้บอกว่า "นี่คือวิธีทำให้วิธีการทำงานของคุณ" มักจะเป็นที่ต้องการใน SO ที่จริงแล้วควรรวมอยู่ในเอกสาร $ .post !!!
Mark E. Haase


โดยวิธีการที่มีresponseJSONคุณสมบัติซึ่งยังมีประโยชน์มากในกรณีที่เป็นประเภทอาแจ็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
การเพิ่มคำอธิบายเพิ่มเติมที่นี่จะช่วยผู้อ่านในอนาคต
Eric Brown เมื่อ

13

วิธีง่ายๆคือการใช้ajaxError :

เมื่อใดก็ตามที่คำขอ Ajax เสร็จสมบูรณ์โดยมีข้อผิดพลาด jQuery จะทริกเกอร์เหตุการณ์ ajaxError ตัวจัดการใด ๆ และทั้งหมดที่ลงทะเบียนด้วย. jaxError () วิธีการจะถูกดำเนินการในเวลานี้

ตัวอย่างเช่น:

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

ฉันขอแนะนำให้อ่านเอกสารajaxError มันทำมากกว่ากรณีใช้งานง่าย ๆ ที่แสดงข้างต้นส่วนใหญ่การเรียกกลับของมันยอมรับพารามิเตอร์จำนวนหนึ่ง:

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

1
+1 - ฉันจะเพิ่มว่าตัวจัดการนี้ได้รับการขัดแย้งหลายประการเพื่อให้คุณสามารถแสดงข้อผิดพลาดที่เกิดขึ้นจริงรหัสการตอบสนอง, URL, ฯลฯ
Nick Craver

โปรดทราบว่าตั้งแต่ jQuery 1.8 ควรแนบเมธอด. jaxError () เข้ากับเอกสารเท่านั้น
Nanki

0

คุณต้องเข้าสู่ระบบ responseText:

$.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

คุณแนบ. handler จัดการกับวัตถุ ajax ทำไมคนยืนยันในการโพสต์ JQuery สำหรับการตอบสนองเมื่อ Vanila ทำงานข้ามแพลตฟอร์ม ...

ตัวอย่างกุ๊กกิ๊ก:

ajax = new XMLHttpRequest();
ajax.open( "POST", "/url/to/handler.php", true );
ajax.onerror = function(){
    alert("Oops! Something went wrong...");
}
ajax.send(someWebFormToken );
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.