jQuery.post( ) .done( ) and success:

54

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个回答

74

jQuery以前仅支持successerrorcomplete回调函数,然后他们决定通过jqXHR对象支持promises,并添加了.done().fail().always()等方法,这些新方法与回调函数的作用基本相同但形式不同。您可以使用适合自己编码风格的任何API样式。

随着人们对promises的熟悉程度越来越高,以及越来越多的异步操作使用该概念,我认为随着时间的推移,越来越多的人将转向promise API,但同时jQuery支持两种类型。

. success()方法已被弃用,使用常见的promise对象方法名称代替它。

jQuery文档中,您可以看到各种promise方法与回调类型的关系:

  

jqXHR.done(function( data, textStatus, jqXHR ) {}); .done()方法是success回调选项的替代构造,取代了已弃用的jqXHR.success()方法。有关实现详细信息,请参阅deferred.done()。

  

jqXHR.fail(function( jqXHR, textStatus, errorThrown ) {}); .fail()方法是error回调选项的替代构造,取代了已弃用的.error()方法。有关实现详细信息,请参阅deferred.fail()。

  

jqXHR.always(function( data|jqXHR, textStatus, jqXHR|errorThrown ) { }); .always()方法是complete回调选项的替代构造,取代了已弃用的.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开始)操作基础Promise。请参阅deferred.then()了解实现细节。

如果您希望以符合ES6 Promise标准的方式编写代码,则这四个选项中只能使用.then()方法。


17

使用Promise而非回调函数的原因是可以有多个回调,避免回调地狱等问题。

回调地狱(更多详情请参见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?
        });
    });
});

使用Promise,上述代码可以重写为:

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();

9

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

这是文档。两者之间的区别在于,.success() 自 jQuery 1.8 起已被弃用。你应该使用 .done() 代替。

如果您不想点击链接:

停用通知

自 jQuery 1.5 引入的 jqXHR.success()jqXHR.error()jqXHR.complete() 回调方法自 jQuery 1.8 开始已被弃用。为了准备将来将其移除,请改用 jqXHR.done()jqXHR.fail()jqXHR.always()


0

来自文档:

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

.done() 方法是 success 回调选项的替代方法,取代了已经被弃用的 jqXHR.success() 方法。有关实现细节,请参阅 deferred.done()。

这个点只是一个成功回调选项的替代方法,而 jqXHR.success() 已经被弃用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接