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

Kae*_*ear 38 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" );
});
Run Code Online (Sandbox Code Playgroud)

success:参数和jqXHR.done( )方法有什么区别; 如果没有,那么该jqXHR.done( )方法的全部意义何在?

jfr*_*d00 54

jQuery的使用只有在回调函数successerrorcomplete.

于是,他们决定支持的承诺与jqXHR对象,这时候他们补充说.done(),.fail(),.always(),等...在承诺API的精神.这些新方法与回调的用途大致相同,但形式不同.您可以使用哪种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开始)操作底层的Promise.有关实现的详细信息,请参阅deferred.then().

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


man*_*wal 14

偏向于回调函数的原因是有多个回调并避免像回调地狱这样的问题.

回调地狱(有关更多详细信息,请参阅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?
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

使用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();
Run Code Online (Sandbox Code Playgroud)


roy*_*wie 8

两者.done().success()有回调函数,它们的功能基本上相同的方式.

这是文档.不同之处在于.success(),从jQuery 1.8开始不推荐使用.你应该使用.done().

如果您不想点击链接:

弃用通知

jqXHR.success(),jqXHR.error()jqXHR.complete()jQuery的1.5引入了回调方法被弃用的jQuery 1.8.要准备的代码为他们的最终消除,使用jqXHR.done(), jqXHR.fail()jqXHR.always()来代替.