jQuery ajax (jsonp) игнорирует тайм-аут и не запускает ошибочное событие

Для добавления некоторой основной обработки ошибок я хотел переписать часть кода, который использовал $ jQuery .getJSON для получения по запросу на некоторой фотографии с Flickr. Причина того, чтобы сделать это состоит в том, что $ .getJSON не предоставляет обработке ошибок или работает с тайм-аутами.

Так как $ .getJSON является просто оберткой вокруг $ .ajax, я решил переписать вещь и неожиданное удивление, это работает безупречно.

Теперь забава запускается все же. Когда я сознательно вызываю 404 (путем изменения URL) или вызываю сеть к тайм-ауту (не будучи сцепленным до межсетей), ошибочное событие не стреляет, вообще. Я в замешательстве относительно того, что я делаю неправильно. Справка очень ценится.

Вот код:

$(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

89
задан Matijs 12 July 2013 в 17:09
поделиться

2 ответа

This is a known limitation with the native jsonp implementation in jQuery. The text below is from IBM DeveloperWorks

JSONP is a very powerful technique for building mashups, but, unfortunately, it is not a cure-all for all of your cross-domain communication needs. It has some drawbacks that must be taken into serious consideration before committing development resources. First and foremost, there is no error handling for JSONP calls. If the dynamic script insertion works, you позвоните; в противном случае ничего не происходит. Он просто тихо терпит неудачу. Например, вы не можете поймать ошибку 404 с сервера. Вы также не можете отменить или перезапустите запрос. Однако вы можете таймаут после ожидания разумного количество времени. (Будущее jQuery версии могут иметь функцию прерывания для JSONP requests.)

However there's a jsonp plug-in available on GoogleCode that provides support for error handling. To get started, just make the following changes to your code.

You can either download it, or just add a script reference to the plug-in.

<script type="text/javascript" 
     src="http://jquery-jsonp.googlecode.com/files/jquery.jsonp-1.0.4.min.js">
</script>

Then modify your ajax call as shown below:

$(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  
    $.jsonp({
        url: jsonFeed,
        data: { "lang" : "en-us",
                "format" : "json",
                "tags" : "sunset"
        },
        dataType: "jsonp",
        callbackParameter: "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);
        }
    });
});
67
ответ дан 24 November 2019 в 07:17
поделиться

Это может быть "известным" ограничением jQuery; однако, как представляется, оно недостаточно хорошо документировано. Сегодня я потратил около 4 часов, пытаясь понять, почему мой тайм-аут не работает.

Я переключился на jquery.jsonp и это сработало как шарм. Спасибо.

8
ответ дан 24 November 2019 в 07:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: