我在这里问了一个问题:refresh page if internet connection available,然后@Fabrizio Calderan使用延迟对象实现给出了一个非常巧妙的解决方案如下:
setInterval(function() {
$.when(
$.ajax({
url : "/favicon.ico", /* or other resource */
type : "HEAD"
})
)
.done(function() {
location.reload();
});
}, 120000); /* 120000 ~> 2 minutes */
我的问题是:
因为ajax调用将返回jqXHR;如果ajax调用失败怎么办?那么ajax的返回类型是什么?它仍然是jqXHR或UNDEFINED或NULL
并且因为ajax的调用将返回jqXHR,这是一个延迟对象;我可以得出以下结论:
延迟对象已解决==> jqXHR
或拒绝==> UNDEFINED
问候
答案 0 :(得分:4)
jQuery ajax调用始终返回jqXHR
对象,无论成功还是失败。它永远不会返回null
或undefined
。
可以通过可选的回调通知函数或通过返回的jqXHR对象看到成功或失败,该对象充当promise对象,因此将获得有关ajax调用完成,成功或失败的承诺通知。
因为jqXHR对象也是一个promise对象,所以你的代码可以简化为:
setInterval(function() {
$.ajax({
url : "/favicon.ico", /* or other resource */
type : "HEAD"
}).done(function() {
location.reload();
});
}, 120000); /* 120000 ~> 2 minutes */
如果您希望收到.done()
以外的其他情况的通知,可以使用.fail()
,.always()
或.then()
。
如果ajax调用立即失败,那么promise将被解析为失败(例如被拒绝)。即使已失败,仍会调用附加到promise对象的后续.fail()
或.always()
处理程序。
以下是相关的jQuery文档:
jQuery 1.5中$ .ajax()返回的jqXHR对象实现了 Promise接口,为它们提供所有属性,方法和 Promise的行为(有关更多信息,请参阅Deferred对象)。 这些方法采用一个或多个函数参数 $ .ajax()请求终止。这允许您分配多个 单个请求上的回调,甚至在回调之后分配回调 请求可能已经完成。 (如果请求已经完成,那么 立即触发回调。)jqXHR的可用Promise方法 对象包括:
jqXHR.done(function(data,textStatus,jqXHR){}); 替代方案 构造成功回调选项,.done()方法替换 不推荐使用的jqXHR.success()方法。请参阅deferred.done() 实施细节。
jqXHR.fail(function(jqXHR,textStatus,errorThrown){}); 错误回调选项的替代构造,.fail()方法 替换已弃用的.error()方法。请参阅deferred.fail() 实施细节。
jqXHR.always(function(data | jqXHR,textStatus,jqXHR | errorThrown){ }); 完整回调选项的替代构造, .always()方法替换了已弃用的.complete()方法。
响应成功的请求,函数的参数是 与.done():data,textStatus和jqXHR对象相同。对于 失败的请求参数与.fail()的参数相同: jqXHR对象,textStatus和errorThrown。参考deferred.always() 有关实施细节。
jqXHR.then(function(data,textStatus,jqXHR){},function(jqXHR, textStatus,errorThrown){}); 包含了。的功能 .done()和.fail()方法,允许(从jQuery 1.8开始) 潜在的承诺被操纵。请参阅deferred.then() 实施细节。