在jQuery中延迟对象中解析和拒绝的含义是什么?

时间:2014-03-26 06:49:10

标签: javascript jquery ajax jquery-deferred

我在这里问了一个问题: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

问候

1 个答案:

答案 0 :(得分:4)

jQuery ajax调用始终返回jqXHR对象,无论成功还是失败。它永远不会返回nullundefined

可以通过可选的回调通知函数或通过返回的jqXHR对象看到成功或失败,该对象充当promise对象,因此将获得有关aj​​ax调用完成,成功或失败的承诺通知。

因为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()   实施细节。