【问题标题】:$.getJSON .always() method won't execute on HTTP error$.getJSON .always() 方法不会在 HTTP 错误时执行
【发布时间】:2013-05-25 18:18:49
【问题描述】:

我正在尝试使用 getJson 检索一些谷歌日历信息。在某些情况下,我尝试检索的日历可能可用也可能不可用,我会得到 GET HTTP 错误 403 或 404,其他时候 GET 会成功。我的问题是即使在 GET 无法接收数据的情况下,我也需要执行一些代码。我认为使用 .always 方法无论如何都会执行此代码,但事实证明它不会在 403 或 404 发生时执行。我还尝试使用 .fail 方法专门针对这种情况,但没有成功。有什么想法吗?

添加代码:

function AcquireGroupFeed(GroupDataBase) {

  // For each group the calendar information is aquired and, if the events are 
  // relevant they are added to the feed. 

  // The group's calendar URL
  var  CalUrl = "http://www.google.com/calendar/feeds/" + GroupDataBase.calendarid + 
        "/public/full?alt=json-in-script&callback=?";

  // Acquiring the data from Google.        
  $.getJSON(CalUrl, function(data) {PushToEventFeed(data, GroupDataBase);})
            .always(function(){CheckAllGroupsAcquired();});

}

【问题讨论】:

  • 它会在出现 http 错误时执行 - 您的代码有问题,或者您使用的是较旧的 jquery
  • 嗨,Thelemitian,这听起来很烦人。但是很难将这些问题诊断为 javascript 问题。如果您收到 4xx(在您的情况下为 403- 禁止,404- 未找到),则表示服务器已收到您的请求,但您发送的请求有问题。如果您认为服务器不应该发送 4xx,邮政编码,这将是一个很好的 SO 问题。否则,请阅读w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10 祝你好运!
  • 感谢大家的快速回复! 4xx 错误是预期的,不是问题。此代码旨在从不同组织拥有的日历中获取信息并生成提要。因此,如果一个装饰删除了一个日历,我会收到其中一个错误,我需要确保我正确处理了这种情况。我希望 .always() 能做到这一点,并且根据 Sam 的评论似乎应该这样做,但是当确实发生错误时不会执行该方法(在没有发生错误时执行)我可能做错了什么,但我没有找到问题。

标签: javascript jquery error-handling getjson


【解决方案1】:

我最近了解到,通过使用 $.ajax 调用而不是 .getJSON,我可以在无法检索 URL 时处理错误。应该为要处理的错误定义超时设置:

$.ajax({
        url: URL,
        dataType: 'json',
        timeout: 3000,
        success: function( data ) { successFunction();},
        error: function( data ) { errorHandling(); }
      });

有了这个,我能够解决我的问题。

【讨论】:

    【解决方案2】:

    您实际上是在执行 JSONP 请求,因为托管页面的域与 AJAX 请求中的域不同。 JSONP 不能使用普通的 XMLHTTPRequest 接口(它使用script 元素),并且不支持失败回调。

    如果您在error 选项下查看$.ajax 函数,您将看到以下注释:

    跨域脚本和跨域 JSONP 请求不调用此处理程序

    这同样适用于$.getJSON(因为它是$.ajax 的包装器)。

    如果您需要失败回调,您可能需要自己编程,可能基于两秒计时器,或类似的东西。

    【讨论】:

    • 感谢lonesomeday!现在,我使用 .always() 而不是 .fail() 或 .error() 你的解释也适用吗? .always() 是否会在发生错误时调用 .fail() 或 .error() 然后执行失败?
    • 哦,没关系...我在您发布的链接中找到了答案响应成功的请求,该函数的参数与.done()的参数相同:data,textStatus , 和 jqXHR 对象。对于失败的请求,参数与 .fail() 的参数相同:jqXHR 对象、textStatus 和 errorThrown。有关实现细节,请参阅 deferred.always()。
    猜你喜欢
    • 2017-05-05
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2016-01-18
    相关资源
    最近更新 更多