首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >jsonp( jQuery )忽略超时并且不触发错误事件

jsonp( jQuery )忽略超时并且不触发错误事件
EN

Stack Overflow用户
提问于 2009-06-16 15:48:08
回答 4查看 50K关注 0票数 89

为了添加一些基本的错误处理,我想重写一段代码,它使用jQuery的$.getJSON从Flickr中拉入一些照片。这样做的原因是$.getJSON不提供错误处理或处理超时。

由于$.getJSON只是$.ajax的一个包装器,我决定重写这个东西并给它一个惊喜,它工作得无懈可击。

不过,现在有趣的事情开始了。当我故意导致404 (通过更改URL)或导致网络超时(由于没有连接到interwebs)时,error事件根本不会触发。我不知道我做错了什么。非常感谢您的帮助。

代码如下:

代码语言:javascript
复制
$(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时提出的

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-26 03:38:27

JSONP1.5及更高版本对jQuery请求的错误处理提供了更好的支持。但是,您需要使用$.ajax方法而不是$.getJSON方法。对我来说,这是可行的:

代码语言:javascript
复制
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

票数 86
EN

Stack Overflow用户

发布于 2011-06-21 01:46:15

如果你坚持使用jQuery 1.4,一个解决方案:

代码语言:javascript
复制
var timeout = 10000;
var id = setTimeout( errorCallback, timeout );
$.ajax({
    dataType: 'jsonp',
    success: function() {
        clearTimeout(id);
        ...
    }
});
票数 12
EN

Stack Overflow用户

发布于 2010-01-13 14:34:29

这可能是jQuery的一个“已知”限制;但是,似乎没有很好的文档记录。我今天花了大约4个小时试图弄明白为什么我的超时不起作用。

我换成了jquery.jsonp,它就像一个护身符一样工作。谢谢。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1002367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档