Hàm lỗi ajax của jQuery


130

Tôi có một cuộc gọi ajax truyền dữ liệu đến một trang mà sau đó trả về một giá trị.

Tôi đã nhận được cuộc gọi thành công từ trang nhưng tôi đã mã hóa nó để nó gây ra lỗi trong asp. Làm thế nào để tôi lấy lỗi đó từ jquery?

Ví dụ:

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

Đó là bit lỗi mà tôi không hiểu. Trong chức năng tôi cần đặt tham số nào, để sau đó tôi có thể sử dụng thông báo lỗi mà tôi đã nêu trong máy chủ.


Có một lỗi đánh máy ở đó: dataTypekhông phải vậy datatype.
Alejandro Nava


7
@ alej27: từ ngữ này khá kỳ quặc, nhưng nó không nói rằng bạn không thể sử dụng cả hai, nó nói rằng một yêu cầu sẽ không gọi thành công và lỗi (vì chúng loại trừ lẫn nhau).
Marty Vance

Hãy cẩn thận với các câu trả lời tại đây Kể từ jQuery 3.0, phần không được chú ý .error.successtrở nên quan trọng hơn khi chúng bị xóa.
Mark Schultheiss

Câu trả lời:


221

Các tham số bắt buộc trong errorhàm Ajax là jqXHR, exceptionvà bạn có thể sử dụng nó như dưới đây:

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

DEMO FIDDLE


Thông số

jqXHR:

Nó thực sự là một đối tượng lỗi trông như thế này

Đối tượng jqXHR lỗi Ajax

Bạn cũng có thể xem điều này trong bảng điều khiển trình duyệt của riêng bạn, bằng cách sử dụng console.logbên trong errorchức năng như:

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

Chúng tôi đang sử dụng thuộc statustính từ đối tượng này để lấy mã lỗi, như nếu chúng tôi nhận được trạng thái = 404, điều này có nghĩa là không thể tìm thấy trang được yêu cầu. Nó hoàn toàn không tồn tại. Dựa trên mã trạng thái đó, chúng tôi có thể chuyển hướng người dùng đến trang đăng nhập hoặc bất kỳ logic kinh doanh nào của chúng tôi yêu cầu.

ngoại lệ:

Đây là biến chuỗi hiển thị loại ngoại lệ. Vì vậy, nếu chúng tôi gặp lỗi 404, exceptionvăn bản sẽ chỉ là "lỗi". Tương tự, chúng tôi có thể nhận được 'thời gian chờ', 'hủy bỏ' như các văn bản ngoại lệ khác.


Thông báo khấu hao: Các jqXHR.success(), jqXHR.error()và các jqXHR.complete()cuộc gọi lại bị phản đối kể từ jQuery 1.8. Để chuẩn bị mã của bạn để loại bỏ cuối cùng của họ, sử dụng jqXHR.done(), jqXHR.fail()jqXHR.always()để thay thế.

Vì vậy, trong trường hợp bạn đang sử dụng jQuery 1.8 trở lên, chúng tôi sẽ cần cập nhật logic hàm thành công và lỗi như: -

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

Hy vọng nó giúp!


6
Điều thú vị là không nên sử dụng ajaxSetup. Xem api.jquery.com/jquery.ajaxsetup
SleepyBoBos

1
@ palaѕн Tôi nghĩ bạn đọc sai thông báo phản đối. Nếu bạn nhận thấy, thông báo phản đối đang nói về sự phản đối của các phương thức jqXHR, nhưng việc sử dụng thành công, lỗi và hoàn thành trong ví dụ trên của bạn được thực hiện trong một đối tượng cho phương thức $ .ajax. Điều này đã không được phản đối và bạn không cần phải chuyển đổi mã của mình. Tuy nhiên, nếu một người thích xâu chuỗi các phương thức thì bạn có thể sử dụng kiểu này. Khi tôi đọc "sự phản đối ..." điều này đã ném tôi đi (không có lý do). :-)
bchr02

Kể từ jQuery 3.0, sự phản đối đã được ghi nhận .error.successtrở nên quan trọng hơn khi chúng bị xóa
Mark Schultheiss

99

Thử cái này:

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

Nếu bạn muốn thông báo cho frontend của mình về lỗi xác thực, hãy thử trả về json:

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

Kịch bản asp của bạn trở lại schould:

{"error": true}

1
TextSttaus và errorThrown dùng để làm gì? Bạn có thể giải thích
Annapurna

4

Đây là cách bạn kéo lỗi asp ra.

              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
Vui lòng cung cấp một số khám phá, không chỉ là một đoạn mã và một liên kết làm tài liệu.
Greg Dubicki

12
Cảm ơn bạn gần như không có gì.
Judasane

chẳng hạn, bạn có thể đã nói "OP đang sử dụng lỗi hàm (lỗi) nhưng jquery đang gọi lỗi hàm (jqXHR, textStatus, errorThrown). Lưu ý 2 tham số bị thiếu trong đoạn mã của OP."
hoài nghi

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

bạn đang sử dụng một chức năng

error(error) 

nhưng jquery thực sự đang tìm kiếm một hàm có ba tham số:

error(jqXHR, textStatus, errorThrown)

bạn sẽ cần thêm hai tham số nữa.

CSONG: xin vui lòng xem tất cả các ý kiến ​​trên có đề cập đến 'không dùng nữa' :)

$.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
bạn sẽ cần thêm hai tham số nữa - điều này rất sai.
Nhà phát triển

1
hmm nếu đó là tất cả những gì bạn phải nói - có thể không nói gì? hoặc, bạn CÓ THỂ giải thích tuyên bố của bạn và thực sự giúp đỡ. Lựa chọn của bạn.
hoài nghi

1
Trong JavaScript, giả sử bạn có một phương thức - function myMethod (err) { alert(err); }và sau đó gọi nó như thế myMethod ("something is wrong", 500, some_object)- Điều này sẽ hoạt động mà không có vấn đề gì. Theo tuyên bố của bạn, điều này sẽ chỉ hoạt động nếu chữ ký phương thức là function myMethod (err, status, some_object). Hãy quên ví dụ trên, chữ ký của successsự kiện bạn có trong câu trả lời thực sự là vậy .success(data, status, xhr), nhưng nếu bạn chỉ cần kết quả, chúng tôi thường liên kết nó như thế .success (data)và cả hai đều hoạt động.
Nhà phát triển

Và bạn đã mang lại giá trị gì bằng cách thêm câu trả lời này? IMO không có bất kỳ thông tin nào trong câu trả lời của bạn bị thiếu trong các câu trả lời trước. Điều duy nhất bạn đã làm là kéo câu hỏi này lên trong ngăn xếp một lần nữa.
Nhà phát triển

0

Từ 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.

Nếu bạn muốn xử lý toàn cầu, bạn có thể sử dụng:

.ajaxStart(), .ajaxStop(),
.ajaxComplete(), .ajaxError(),
.ajaxSuccess(), .ajaxSend()
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.