jQuery ajax error function


130

ฉันมีการโทร ajax ที่ส่งผ่านข้อมูลไปยังเพจซึ่งจะส่งคืนค่า

ฉันเรียกข้อมูลการโทรที่ประสบความสำเร็จจากหน้านี้ แต่ฉันได้เข้ารหัสมันเพื่อให้เกิดข้อผิดพลาดใน asp ฉันจะดึงข้อผิดพลาดนั้นจาก jquery ได้อย่างไร?

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

cache: false,
url: "addInterview_Code.asp",
type: "POST",
datatype: "text",
data: strData,
success: function (html) {
    alert('successful : ' + html);
    $("#result").html("Successful");
},
error: function (error) {
    **alert('error; ' + eval(error));**
}

มันเป็นบิตของข้อผิดพลาดที่ฉันไม่เข้าใจ ในฟังก์ชันฉันต้องใส่พารามิเตอร์อะไรเพื่อที่ฉันจะได้ใช้ข้อความแสดงข้อผิดพลาดที่ฉันยกขึ้นในเซิร์ฟเวอร์


มีการพิมพ์ผิดมี: มันไม่ได้dataType datatype
Alejandro Nava


7
@ alej27: คำพูดเป็นเรื่องแปลก แต่ไม่ได้บอกว่าคุณไม่สามารถใช้ทั้งสองอย่างได้กล่าวว่าคำขอจะไม่เรียกความสำเร็จและข้อผิดพลาด (เนื่องจากเป็นคำที่ไม่ซ้ำกัน)
Marty Vance

ใช้ความระมัดระวังกับคำตอบที่นี่ ณ jQuery 3.0 การเลิกใช้งานที่ระบุไว้.errorและ.successมีความสำคัญมากขึ้นเมื่อถูกลบออก
Mark Schultheiss

คำตอบ:


222

พารามิเตอร์ที่ต้องการในerrorฟังก์ชันAjax คือjqXHR, exceptionและคุณสามารถใช้ได้ดังนี้:

$.ajax({
    url: 'some_unknown_page.html',
    success: function (response) {
        $('#post').html(response.responseText);
    },
    error: function (jqXHR, exception) {
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    },
});

สาธิต FIDDLE


พารามิเตอร์

jqXHR:

มันเป็นวัตถุข้อผิดพลาดซึ่งมีลักษณะเช่นนี้

ข้อผิดพลาด Ajax วัตถุ jqXHR

คุณยังสามารถดูสิ่งนี้ได้ในคอนโซลเบราว์เซอร์ของคุณเองโดยใช้console.logภายในerrorฟังก์ชันเช่น:

error: function (jqXHR, exception) {
    console.log(jqXHR);
    // Your error handling logic here..
}

เรากำลังใช้statusคุณสมบัติจากวัตถุนี้เพื่อรับรหัสข้อผิดพลาดเช่นถ้าเราได้รับ status = 404 หมายความว่าไม่พบหน้าที่ร้องขอ มันไม่มีอยู่เลย จากรหัสสถานะนั้นเราสามารถเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าเข้าสู่ระบบหรือสิ่งที่ตรรกะทางธุรกิจของเราต้องการ

ยกเว้น:

นี่คือตัวแปรสตริงที่แสดงประเภทข้อยกเว้น ดังนั้นหากเราได้รับข้อผิดพลาด 404 exceptionข้อความจะเป็นเพียง 'ข้อผิดพลาด' ในทำนองเดียวกันเราอาจได้รับ "หมดเวลา" "ยกเลิก" เป็นข้อความยกเว้นอื่น ๆ


การเลิกประกาศ:jqXHR.success() , jqXHR.error()และjqXHR.complete()เรียกกลับจะถูกเลิกใช้เมื่อ jQuery 1.8 เพื่อเตรียมความพร้อมรหัสของคุณสำหรับการกำจัดของพวกเขาในที่สุดการใช้งานjqXHR.done(), jqXHR.fail()และjqXHR.always()แทน

ดังนั้นในกรณีที่คุณใช้jQuery 1.8 ขึ้นไปเราจะต้องอัปเดตตรรกะของฟังก์ชันความสำเร็จและข้อผิดพลาดเช่น: -

// Assign handlers immediately after making the request,
// and remember the jqXHR object for this request
var jqxhr = $.ajax("some_unknown_page.html")
    .done(function (response) {
        // success logic here
        $('#post').html(response.responseText);
    })
    .fail(function (jqXHR, exception) {
        // Our error logic here
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    })
    .always(function () {
        alert("complete");
    });

หวังว่าจะช่วยได้!


6
ที่น่าสนใจไม่แนะนำให้ใช้ ajaxSetup ดูapi.jquery.com/jquery.ajaxsetup
SleepyBoBos

1
@ palaѕнฉันคิดว่าคุณอ่านหนังสือแจ้งการเลิกใช้งานผิด หากคุณสังเกตเห็นการแจ้งเลิกใช้งานกำลังพูดถึงการเลิกใช้งานวิธีการของ jqXHR แต่การใช้ความสำเร็จข้อผิดพลาดและการทำให้สมบูรณ์ในตัวอย่างข้างต้นของคุณจะทำภายในออบเจ็กต์ของเมธอด $ .ajax สิ่งนี้ยังไม่ได้เลิกใช้งานและคุณไม่จำเป็นต้องเปลี่ยนรหัสของคุณ อย่างไรก็ตามหากใครชอบที่จะเชื่อมโยงวิธีการคุณสามารถใช้สไตล์นี้ได้ เมื่อฉันอ่าน "การเลิกใช้งาน ... " สิ่งนี้ทำให้ฉันท้อใจ (โดยไม่มีเหตุผล) :-)
bchr02

ในขณะที่ jQuery 3.0 เลิกใช้งานแล้ว.errorและ.successมีความสำคัญมากขึ้นเมื่อถูกลบออก
Mark Schultheiss

99

ลองสิ่งนี้:

error: function(jqXHR, textStatus, errorThrown) {
  console.log(textStatus, errorThrown);
}

หากคุณต้องการแจ้งส่วนหน้าของคุณเกี่ยวกับข้อผิดพลาดในการตรวจสอบความถูกต้องให้ลองส่งคืน json:

dataType: 'json',
success: function(data, textStatus, jqXHR) {
   console.log(data.error);
}

สคริปต์ asp ของคุณกลับมา:

{"error": true}

1
textSttaus และ errorThrown คืออะไร? คุณช่วยอธิบายได้ไหม
Annapurna

4

นี่คือวิธีที่คุณดึงข้อผิดพลาด asp ออก

              cache: false,
              url: "addInterview_Code.asp",
              type: "POST",
              datatype: "text",
              data: strData,
              success: function (html) {
                  alert('successful : ' + html);
                  $("#result").html("Successful");
              },
              error: function (jqXHR, textStatus, errorThrown) {
                  if (jqXHR.status == 500) {
                      alert('Internal error: ' + jqXHR.responseText);
                  } else {
                      alert('Unexpected error.');
                  }
              }

2
error(jqXHR, textStatus, errorThrown)

http://api.jquery.com/jQuery.ajax/


9
โปรดระบุข้อมูลที่ชัดเจนไม่ใช่แค่ส่วนของโค้ดและลิงก์สำหรับทำเอกสาร
Greg Dubicki

12
ขอบคุณที่แทบไม่มี
judasane

ตัวอย่างเช่นคุณอาจพูดได้ว่า "OP ใช้ฟังก์ชัน error (error) แต่ jquery เรียกใช้ function error (jqXHR, textStatus, errorThrown) สังเกตพารามิเตอร์ 2 ตัวที่หายไปในตัวอย่างของ OP"
เหลือเชื่อ

2
          cache: false,
          url: "addInterview_Code.asp",
          type: "POST",
          datatype: "text",
          data: strData,
          success: function (html) {
              alert('successful : ' + html);
              $("#result").html("Successful");
          },
          error: function(data, errorThrown)
          {
              alert('request failed :'+errorThrown);
          }

2

คุณกำลังใช้ฟังก์ชัน

error(error) 

แต่จริงๆแล้ว jquery กำลังมองหาฟังก์ชันที่มีพารามิเตอร์สามตัว:

error(jqXHR, textStatus, errorThrown)

คุณจะต้องเพิ่มพารามิเตอร์อีกสองตัว

นอกจากนี้: โปรดดูความคิดเห็นทั้งหมดด้านบนที่กล่าวถึง 'เลิกใช้งาน' :)

$.ajax("www.stackoverflow.com/api/whatever", {
    dataType:"JSON"
    data: { id=1, name='example' }
}).succes(function (result) {
    // use result
}).error(function (jqXHR, textStatus, errorThrown) {
    // handle error
});

4
คุณจะต้องเพิ่มพารามิเตอร์อีกสองตัว ซึ่งผิดมาก
พัฒนา

1
อืมม ถ้านั่นคือทั้งหมดที่คุณต้องพูด - อาจจะไม่พูดอะไร? หรือคุณสามารถอธิบายคำชี้แจงของคุณและช่วยได้จริง ทางเลือกของคุณ.
เหลือเชื่อ

1
ใน JavaScript ให้บอกว่าคุณมีวิธีการ - function myMethod (err) { alert(err); }แล้วเรียกมันว่าmyMethod ("something is wrong", 500, some_object)- สิ่งนี้จะใช้งานได้โดยไม่มีปัญหาใด ๆ ตามคำชี้แจงของคุณสิ่งนี้จะใช้ได้เฉพาะเมื่อมีลายเซ็นของวิธีการfunction myMethod (err, status, some_object)เท่านั้น อย่าลืมตัวอย่างข้างต้นลายเซ็นของsuccessเหตุการณ์ที่คุณมีในคำตอบนั้นเป็นจริง.success(data, status, xhr)แต่ถ้าคุณต้องการเพียงแค่ผลลัพธ์เรามักจะผูกมันไว้เหมือนกัน.success (data)และใช้ได้ทั้งสองอย่าง
พัฒนา

และคุณเพิ่มคุณค่าอะไรจากการเพิ่มคำตอบนี้? IMO ไม่มีข้อมูลในคำตอบของคุณซึ่งขาดหายไปในคำตอบก่อนหน้านี้ สิ่งเดียวที่คุณทำคือดึงคำถามนี้ขึ้นมาในกองอีกครั้ง
พัฒนา

0

จาก jquery.com:

The jqXHR.success(), jqXHR.error(), and jqXHR.complete()
callback methods introduced injQuery 1.5 are deprecated
as of jQuery 1.8. To prepare your code for their eventual 
removal, use jqXHR.done(), jqXHR.fail(), and jqXHR.always() instead.

หากคุณต้องการเครื่องจัดการส่วนกลางคุณสามารถใช้:

.ajaxStart(), .ajaxStop(),
.ajaxComplete(), .ajaxError(),
.ajaxSuccess(), .ajaxSend()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.