Javascript $.getJSON.always()方法赢得';无法在HTTP错误上执行

Javascript $.getJSON.always()方法赢得';无法在HTTP错误上执行,javascript,jquery,error-handling,getjson,Javascript,Jquery,Error Handling,Getjson,我正在尝试使用getJson检索一些google日历信息。在某些情况下,我试图检索的日历可能可用,也可能不可用,我将得到get HTTP错误403或404,其他时间get将成功。我的问题是,即使GET无法接收数据,我也需要执行一些代码。我原以为使用.always方法会执行这段代码,但当403或404发生时,它不会执行。我还尝试使用.fail方法专门针对这种情况,但没有成功。有什么想法吗 添加代码: function AcquireGroupFeed(GroupDataBase) { //

我正在尝试使用getJson检索一些google日历信息。在某些情况下,我试图检索的日历可能可用,也可能不可用,我将得到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();});

}

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

如果查看函数的
错误
选项,您将看到以下注释:

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

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


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

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

如果查看函数的
错误
选项,您将看到以下注释:

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

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


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

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

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

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

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

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

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

当出现http错误时,它确实会执行——要么代码有问题,要么使用的是旧的jqueryHi,Thelemitian,这听起来很烦人。但很难将这些问题诊断为javascript问题。如果您得到一个4xx返回(在您的案例403-禁止,404-未找到),这意味着服务器已收到您的请求,但您发送的请求有问题。如果您认为服务器不应该发送4xx,post代码,这将是一个很好的问题。否则,请阅读最美好的祝愿和好运!谢谢你们的快速回复!4xx错误是预期的,不是问题所在。此代码旨在从不同组织拥有的日历中获取信息并生成提要。所以,如果一个ornanization删除了一个日历,我将得到其中一个错误,我需要确保我正确地处理这个问题。我希望.always()能起到作用,根据Sam的评论,它似乎应该这样做,但当错误发生时(在没有错误发生时)不会执行该方法。我可能做错了什么,但我没有发现问题。当出现http错误时,它会执行-您的代码可能有问题,或者你用的是一个老的jqueryHi,Thelemitian,这听起来很烦人。但很难将这些问题诊断为javascript问题。如果您得到一个4xx返回(在您的案例403-禁止,404-未找到),这意味着服务器已收到您的请求,但您发送的请求有问题。如果您认为服务器不应该发送4xx,post代码,这将是一个很好的问题。否则,请阅读最美好的祝愿和好运!谢谢你们的快速回复!4xx错误是预期的,不是问题所在。此代码旨在从不同组织拥有的日历中获取信息并生成提要。所以,如果一个ornanization删除了一个日历,我将得到其中一个错误,我需要确保我正确地处理这个问题。我一直希望.always()能做到这一点,根据Sam的评论,它似乎应该做到,但当错误发生时,该方法不会执行(在没有错误发生时执行)。我可能做错了什么,但我没有发现问题。谢谢lonesomeday!现在,我使用的是.always()而不是.fail()或.error(),您的解释也适用吗?.always()会在错误发生时调用.fail()或.error(),然后执行失败吗?哦,没关系。。。我在您为响应成功请求而发布的链接中找到了答案,该函数的参数与.done()的参数相同:data、textStatus和jqXHR对象。对于失败的请求,参数与.fail()的参数相同:jqXHR对象、textStatus和errorThrown。有关实现的详细信息,请参阅deferred.always()。谢谢lonesomeday!现在,我使用的是.always()而不是.fail()或.error(),您的解释也适用吗?.always()会在错误发生时调用.fail()或.error(),然后执行失败吗?哦,没关系。。。我在您为响应成功请求而发布的链接中找到了答案,该函数的参数与.done()的参数相同:data、textStatus和jqXHR对象。对于失败的请求,参数与.fail()的参数相同:jqXHR对象、textStatus和errorThrown。有关实现的详细信息,请参阅deferred.always()。