jQuery.post()。done()和成功:

时间:2014-03-06 02:12:55

标签: jquery jqxhr

关于jQuery

jQuery.post( )文档

// Assign handlers immediately after making the request,
// and remember the jqxhr object for this request
var jqxhr = $.post( "example.php", function() {
  alert( "success" );
})
  .done(function() {
    alert( "second success" );
  })
  .fail(function() {
    alert( "error" );
  })
  .always(function() {
    alert( "finished" );
});

// Perform other work here ...

// Set another completion function for the request above
jqxhr.always(function() {
  alert( "second finished" );
});

success:参数和jqXHR.done( )方法之间有什么区别;如果没有,jqXHR.done( )方法的全部内容是什么?

4 个答案:

答案 0 :(得分:49)

jQuery过去只有successerror以及complete的回调函数。

然后,他们决定支持使用jqXHR对象的promises,当他们在promise API的精神中添加.done().fail().always()等时。这些新方法与回调的用途大致相同,但形式不同。您可以使用哪种API样式更适合您的编码风格。

随着人们越来越熟悉promises,越来越多的异步操作使用这个概念,我怀疑越来越多的人会随着时间的推移转向promise API,但同时jQuery支持这两者。

不推荐使用.success()方法,而采用常见的promise对象方法名称。

jQuery doc,您可以看到各种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()   实施细节。

如果您想以更符合ES6 Promises标准的方式进行编码,那么在这四个选项中您只能使用.then()

答案 1 :(得分:14)

优先使用Promise而不是回调函数的原因是有多个回调并避免像Callback Hell这样的问题。

回调地狱(有关详细信息,请参阅http://callbackhell.com/): 异步javascript或使用回调的javascript很难直观地获得。很多代码看起来像这样:

asyncCall(function(err, data1){
    if(err) return callback(err);       
    anotherAsyncCall(function(err2, data2){
        if(err2) return calllback(err2);
        oneMoreAsyncCall(function(err3, data3){
            if(err3) return callback(err3);
            // are we done yet?
        });
    });
});

使用Promises上面的代码可以改写如下:

asyncCall()
.then(function(data1){
    // do something...
    return anotherAsyncCall();
})
.then(function(data2){
    // do something...  
    return oneMoreAsyncCall();    
})
.then(function(data3){
    // the third and final async response
})
.fail(function(err) {
    // handle any error resulting from any of the above calls    
})
.done();

答案 2 :(得分:8)

.done().success()都是回调函数,它们的功能基本相同。

这是documentation。不同之处在于,从jQuery 1.8开始,.success()已被弃用。您应该使用.done()代替。

如果您不想点击链接:

  

弃用通知

     

jqXHR.success()jqXHR.error()jqXHR.complete()回调   jQuery 1.5中引入的方法在jQuery 1.8中已弃用。至   准备好最终删除的代码,使用jqXHR.done(),   jqXHR.fail()jqXHR.always()代替。

答案 3 :(得分:0)

From the doc

  

jqXHR.done(function(data,textStatus,jqXHR){});

     

替代构造成功回调选项,.done()   方法替换已弃用 jqXHR.success()方法。参考   deferred.done()用于实现细节。

这只是成功回调选项的替代方案,并且不推荐使用jqXHR.success()