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?
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?
Câu trả lời:
$.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"); });
JSONP
có vẻ như getJSON
trong 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 JSONP
xử lý hoàn toàn khác với các AJAX
cuộc gọi thông thường jQuery
mặc dù getJSON
xử 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
.
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);
})
Đây là bổ sung của tôi.
Từ http://www.learnjavascript.co.uk/jq/reference/ajax/getjson.html và nguồ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!'); });
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.
$.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
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
}
});
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.
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 setTimeout
hà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);
}