Xử lý lỗi trong các cuộc gọi getJSON


192

Làm thế nào bạn có thể xử lý lỗi trong một cuộc gọi getJSON? Tôi đang cố gắng tham khảo một dịch vụ tập lệnh tên miền chéo bằng jsonp, làm thế nào để bạn đăng ký một phương thức lỗi?



Ajay, tại sao không xem xét đánh dấu câu trả lời đúng?
Ionică Bizău

@ IonicăBizău Đã đánh dấu nó ngay bây giờ. Tôi chỉ mất dấu vết của điều này trong một thời gian. Câu trả lời hàng đầu là không nói về JSONP. Như Ben Shelock đã chỉ ra, không có trình xử lý lỗi được hỗ trợ nào là điều tôi tin ..
Ajay

Câu trả lời:


277

$.getJSON() là một dạng trừu tượng của một cuộc gọi AJAX thông thường mà bạn sẽ phải nói rằng bạn muốn có một phản hồi được mã hóa JSON.

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

Bạn có thể xử lý lỗi theo hai cách: nói chung (bằng cách định cấu hình các cuộc gọi AJAX của bạn trước khi thực sự gọi chúng) hoặc cụ thể (với chuỗi phương thức).

'chung chung' sẽ là một cái gì đó như:

$.ajaxSetup({
      "error":function() { alert("error");  }
});

Và cách 'cụ thể':

$.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });

Không! Bạn có thể đi như bạn muốn ở đó. Hãy xem các tài liệu để được trợ giúp chi tiết hơn: http://api.jquery.com/jQuery.ajax
Luciano Costa

5
Lưu ý rằng điều này yêu cầu jQuery 1.5+ (đã cố gắng để nó hoạt động với jQuery 1.3 và tự hỏi tại sao nó lại phàn nàn về phương thức không hợp lệ :-)
kenyee

24
OP đang hỏi cụ thể về trang web chéo JSONPcó vẻ như getJSONtrong trường hợp đó không gọi error()chức năng này. Im có cùng một vấn đề. Tôi đoán nó liên quan đến cách JSONPxử lý hoàn toàn khác với các AJAXcuộc gọi thông thường jQuerymặc dù getJSONxử lý cả hai. JSONđược thực hiện với một XMLHTTPRequestđối tượng nhưng JSONPđược thực hiện bằng cách tự động thêm một <script>thẻ vào trang HEAD.
hà mã

3
JQuery Doc nói "Lưu ý: Trình xử lý này không được gọi cho các yêu cầu JSONP và tên miền chéo." lỗi api.jquery.com/jQuery.ajax >
OneWorld

10
"Các phương thức gọi lại jqXHR.success (), jqXHR.error () và jqXHR.complete () được giới thiệu trong jQuery 1.5 không được dùng nữa trong jQuery 1.8. Để chuẩn bị mã của bạn để loại bỏ cuối cùng, hãy sử dụng jqXHR.done (), jqXHR thay vào đó .fail () và jqXHR.always (). "
Skorunka František

86

Ai đó cho Luciano những điểm này :) Tôi vừa kiểm tra câu trả lời của anh ấy - vừa có một câu hỏi tương tự - và hoạt động hoàn hảo ...

Tôi thậm chí còn thêm 50 xu của mình:

.error(function(jqXHR, textStatus, errorThrown) {
        console.log("error " + textStatus);
        console.log("incoming Text " + jqXHR.responseText);
    })

3
Đây có phải là với JSONP chéo trang web hoặc với cùng một trang web JSON không?
hà mã

28
Câu trả lời tốt đẹp! Chỉ cần một lưu ý về .error: Nó sẽ không dùng nữa trong jQuery 1.8, vì vậy hãy sử dụng .fail
Anatoly Mironov

73

Đây là bổ sung của tôi.

Từ http://www.learnjavascript.co.uk/jq/reference/ajax/getjson.htmlnguồn chính thức

" Các phương thức gọi lại jqXHR.success (), jqXHR.error () và jqXHR.complete () được giới thiệu trong jQuery 1.5 không được dùng nữa trong jQuery 1.8. Để chuẩn bị mã của bạn để loại bỏ cuối cùng, hãy sử dụng jqXHR.done (), jqXHR thay vào đó .fail () và jqXHR.always (). "

Tôi đã làm điều đó và đây là đoạn mã được cập nhật của Luciano:

$.getJSON("example.json", function() {
  alert("success");
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function() { alert('getJSON request failed! '); })
.always(function() { alert('getJSON request ended!'); });

Và với mô tả lỗi cộng với hiển thị tất cả dữ liệu json dưới dạng chuỗi:

$.getJSON("example.json", function(data) {
  alert(JSON.stringify(data));
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); })
.always(function() { alert('getJSON request ended!'); });

Nếu bạn không thích cảnh báo, hãy thay thế chúng bằng console.log

$.getJSON("example.json", function(data) {
  console.log(JSON.stringify(data));
})
.done(function() { console.log('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { console.log('getJSON request failed! ' + textStatus); })
.always(function() { console.log('getJSON request ended!'); });

thứ tự thời gian thực hiện, thất bại, luôn luôn và mã bên trong getJSON là gì?
TheLogicGuy

lưu ý: console.log không được triển khai trong các trình duyệt cũ hơn như IE7! Chỉ trong trường hợp bạn sử dụng nó!
MadMad666

12

Tôi biết đã được một thời gian kể từ khi ai đó trả lời ở đây và người đăng có lẽ đã nhận được câu trả lời của anh ta từ đây hoặc từ một nơi khác. Tuy nhiên tôi nghĩ rằng bài đăng này sẽ giúp bất cứ ai đang tìm cách theo dõi lỗi và thời gian chờ trong khi thực hiện các yêu cầu getJSON. Vì vậy, dưới câu trả lời của tôi cho câu hỏi

Cấu trúc getJSON như sau (được tìm thấy trên http://api.jqueri.com ):

$(selector).getJSON(url,data,success(data,status,xhr))

hầu hết mọi người thực hiện bằng cách sử dụng

$.getJSON(url, datatosend, function(data){
    //do something with the data
});

trong đó họ sử dụng var var để cung cấp liên kết đến dữ liệu JSON, datatosend là nơi để thêm "?callback=?"và các biến khác phải gửi để nhận dữ liệu JSON chính xác và hàm funcion thành công như một hàm để xử lý dữ liệu .

Tuy nhiên, bạn có thể thêm các biến trạng thái và xhr trong hàm thành công của mình. Biến trạng thái chứa một trong các chuỗi sau: "thành công", "không sửa đổi", "lỗi", "hết thời gian" hoặc "trình phân tích cú pháp" và biến xhr chứa đối tượng XMLHttpRequest ( được tìm thấy trên w3schools )

$.getJSON(url, datatosend, function(data, status, xhr){
    if (status == "success"){
        //do something with the data
    }else if (status == "timeout"){
        alert("Something is wrong with the connection");
    }else if (status == "error" || status == "parsererror" ){
        alert("An error occured");
    }else{
        alert("datatosend did not change");
    }         
});

Bằng cách này, thật dễ dàng để theo dõi thời gian chờ và lỗi mà không phải thực hiện trình theo dõi thời gian chờ tùy chỉnh được bắt đầu sau khi yêu cầu được thực hiện.

Hy vọng điều này sẽ giúp ai đó vẫn đang tìm kiếm một câu trả lời cho câu hỏi này.


2
Điều này không hoạt động. Cuộc gọi lại "thành công", như tên gọi của nó, chỉ được gọi là thành công. (Vì vậy, tôi không chắc tham số "trạng thái" là gì cho ...)
jwelsh

4

$.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })

Nó được sửa trong jQuery 2.x; Trong jQuery 1.x, bạn sẽ không bao giờ nhận được một cuộc gọi lại lỗi


1

Tôi đã phải đối mặt với vấn đề tương tự, nhưng thay vì tạo ra các cuộc gọi lại cho một yêu cầu không thành công, tôi chỉ đơn giản trả về một lỗi với đối tượng dữ liệu json.

Nếu có thể, đây có vẻ là giải pháp dễ nhất. Đây là một mẫu mã Python tôi đã sử dụng. (Sử dụng Flask, Flask's jsonify f và SQLAlchemy)

try:
    snip = Snip.query.filter_by(user_id=current_user.get_id(), id=snip_id).first()
    db.session.delete(snip)
    db.session.commit()
    return jsonify(success=True)
except Exception, e:
    logging.debug(e)
    return jsonify(error="Sorry, we couldn't delete that clip.")

Sau đó, bạn có thể kiểm tra Javascript như thế này;

$.getJSON('/ajax/deleteSnip/' + data_id,
    function(data){
    console.log(data);
    if (data.success === true) {
       console.log("successfully deleted snip");
       $('.snippet[data-id="' + data_id + '"]').slideUp();
    }
    else {
       //only shows if the data object was returned
    }
});

Điều này tốt cho các lỗi xảy ra trong máy chủ, nhưng nó không bắt được khi cuộc gọi không thể đến máy chủ hoặc nếu có lỗi được ném trước khi nó chạm vào mã máy chủ, chẳng hạn như nếu người dùng MVC không còn được xác thực.
Lee Oades

1

Tại sao không

getJSON('get.php',{cmd:"1", typeID:$('#typesSelect')},function(data) {
    // ...
});

function getJSON(url,params,callback) {
    return $.getJSON(url,params,callback)
        .fail(function(jqXMLHttpRequest,textStatus,errorThrown) {
            console.dir(jqXMLHttpRequest);
            alert('Ajax data request failed: "'+textStatus+':'+errorThrown+'" - see javascript console for details.');
        })
}

??

Để biết chi tiết về .fail()phương thức được sử dụng (jQuery 1.5+), hãy xem http://api.jquery.com/jQuery.ajax/#jqXHR

Kể từ khi jqXHRđược trả về bởi hàm, một chuỗi như

$.when(getJSON(...)).then(function() { ... });

có khả năng.


0

Trong một số trường hợp, bạn có thể gặp phải vấn đề đồng bộ hóa với phương pháp này. Tôi đã viết cuộc gọi lại bên trong một setTimeouthàm và nó hoạt động đồng bộ chỉ tốt =)

VÍ DỤ:

function obterJson(callback) {


    jqxhr = $.getJSON(window.location.href + "js/data.json", function(data) {

    setTimeout(function(){
        callback(data);
    },0);
}
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.