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( )
方法的全部内容是什么?
答案 0 :(得分:49)
jQuery过去只有success
和error
以及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()
。