当我使用.ajax和JSONP时,如何处理失败的JSON请求?

时间:2011-07-14 18:52:00

标签: jquery ajax error-handling jsonp

我正在编写一个小的reddit图像查看应用程序,如果用户输入有效的子reddit,它可以正常工作。但我正在尝试处理一个不存在的reddit的情况,无法弄明白。

function load_data(after) {
    $.ajaxSetup({
        "error": function () {
            // this gets called every time, even for a valid sub-reddit
            location.href = 'index.html';
        }
    });

    fetchUrl = 'http://reddit.com/r/' + subreddit + '.json?jsonp=process_images&after=' + after;

    $.ajax({
        type: "GET",
        url: fetchUrl,
        dataType: "jsonp",
        cycleTime: 1,
        success: process_images
        // error: handle_error <- this doesn't work, because we're using jsonp
        // but if I take out jsonp, my whole app doesn't work any longer, since
        // I'm trying to run it as a local .html file, and cross-site scripting
        // security prevents it
    });
}

load_data(after);

这是服务器的响应。但我无法在.ajax方法中处理它:

GET http://www.reddit.com/r/%3Blk%3Blkl%3B.json?jsonp=process_images&after=&callback=jQuery1510605472848052159_1310668370375&_=1310668370433 404 (Not Found)

有什么想法吗?

我在这里尝试了一些建议,比如jQuery.getJSON doesn't trigger callback - 但它每次都显示基本相同的错误,并且没有调用'jQuery #####'的随机数字。

4 个答案:

答案 0 :(得分:4)

请看this answer另一个问题。

本质上,它是JQuery中jsonp实现的一个限制。流行的答案是使用this js插件。

答案 1 :(得分:2)

实际上这是跨域脚本注入的限制,这是jQuery用于JSONP的。

jquery-jsonp plugin和更新版本的jQuery都通过实现超时来解决这个问题。他们仍然无法捕获错误。

更好的解决方案是尽可能使用CORS (Cross-Origin Resource Sharing)

较新版本的jQuery支持CORS,但浏览器和远程站点也必须支持它。

所有主要桌面浏览器的当前版本仅支持版本10的CORS,Internet Explorer。

答案 2 :(得分:1)

您可以在服务器响应中添加一些标题,以便在需要时允许跨域...

答案 3 :(得分:0)

$.ajax({
  statusCode: {
    404: function() {
      //handle the 404 here
      alert('page not found');
    }
  }
});

这是ref:http://api.jquery.com/jQuery.ajax/

修改

不能与jsonp合作,请参阅ccurrens的上述答案