为了添加一些基本的错误处理,我想重写一段代码,它使用jQuery的$.getJSON从Flickr中拉入一些照片。这样做的原因是$.getJSON不提供错误处理或处理超时。
由于$.getJSON只是$.ajax的一个包装器,我决定重写这个东西并给它一个惊喜,它工作得无懈可击。
不过,现在有趣的事情开始了。当我故意导致404 (通过更改URL)或导致网络超时(由于没有连接到interwebs)时,error事件根本不会触发。我不知道我做错了什么。非常感谢您的帮助。
代码如下:
$(document).ready(function(){
// var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne"; // correct URL
var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne_______"; // this should throw a 404
$.ajax({
url: jsonFeed,
data: { "lang" : "en-us",
"format" : "json",
"tags" : "sunset"
},
dataType: "jsonp",
jsonp: "jsoncallback",
timeout: 5000,
success: function(data, status){
$.each(data.items, function(i,item){
$("<img>").attr("src", (item.media.m).replace("_m.","_s."))
.attr("alt", item.title)
.appendTo("ul#flickr")
.wrap("<li><a href=\"" + item.link + "\"></a></li>");
if (i == 9) return false;
});
},
error: function(XHR, textStatus, errorThrown){
alert("ERREUR: " + textStatus);
alert("ERREUR: " + errorThrown);
}
});
});
我想补充的是,这个问题是在jQuery版本为1.4.2时提出的
发布于 2011-02-26 03:38:27
JSONP1.5及更高版本对jQuery请求的错误处理提供了更好的支持。但是,您需要使用$.ajax
方法而不是$.getJSON
方法。对我来说,这是可行的:
var req = $.ajax({
url : url,
dataType : "jsonp",
timeout : 10000
});
req.success(function() {
console.log('Yes! Success!');
});
req.error(function() {
console.log('Oh noes!');
});
当10秒后没有成功的请求时,超时似乎起到了作用,并调用错误处理程序。
我在这个问题上也做了一些blogpost。
发布于 2011-06-21 01:46:15
如果你坚持使用jQuery 1.4,一个解决方案:
var timeout = 10000;
var id = setTimeout( errorCallback, timeout );
$.ajax({
dataType: 'jsonp',
success: function() {
clearTimeout(id);
...
}
});
发布于 2010-01-13 14:34:29
这可能是jQuery的一个“已知”限制;但是,似乎没有很好的文档记录。我今天花了大约4个小时试图弄明白为什么我的超时不起作用。
我换成了jquery.jsonp,它就像一个护身符一样工作。谢谢。
https://stackoverflow.com/questions/1002367
复制相似问题