ajax请求then和done的区别,jQuery.ajax处理继续响应:“success:”vs“.done”?
料青山看我应如是
success一直是jQuery成功回调的传统名称,定义为ajax调用中的一个选项。但是,由于实现了$.Deferreds更复杂的回调,因此done是实现成功回调的首选方法,因为它可以在任何回调上调用deferred。例如,成功:$.ajax({
url: '/',
success: function(data) {}});例如,完成:$.ajax({url: '/'}).done(function(data) {});好处done是,返回值$.ajax现在是一个延迟的promise,可以绑定到应用程序中的任何其他位置。所以,假设你想从几个不同的地方进行这个ajax调用。而不是你的成功传递函数作为一个选项,以使这个Ajax调用的功能,你可以有函数返回$.ajax自身和绑定你的回调done,fail,then,或什么的。请注意,always无论请求成功还是失败,都将运行回调。done只会在成功时触发。例如:function xhr_get(url) {
return $.ajax({
url: url,
type: 'get',
dataType: 'json',
beforeSend: showLoadingImgFn })
.always(function() {
// remove loading image maybe
})
.fail(function() {
// handle request failures
});}xhr_get('/index').done(function(data) {
// do stuff with index data});xhr_get('/id').done(function(data) {
// do stuff with id data});在可维护性方面,这一点的一个重要好处是,您已将ajax机制包装在特定于应用程序的函数中。如果您决定$.ajax将来需要以不同的方式运行,或者使用不同的ajax方法,或者您不再使用jQuery,则只需更改xhr_get定义(确保返回承诺或至少返回一个done方法,以上例子的情况)。整个应用程序中的所有其他引用可以保持不变。您可以使用更多(更酷)的事情$.Deferred,其中之一是pipe用于触发服务器报告的错误的失败,即使$.ajax请求本身成功。例如:function xhr_get(url) {
return $.ajax({
url: url,
type: 'get',
dataType: 'json'
})
.pipe(function(data) {
return data.responseCode != 200 ?
$.Deferred().reject( data ) :
data;
})
.fail(function(data) {
if ( data.responseCode )
console.log( data.responseCode );
});}xhr_get('/index').done(function(data) {
// will not run if json returned from ajax has responseCode other than 200});$.Deferred在这里阅读更多信息:http://api.jquery.com/category/deferred-object/注意:从jQuery 1.8开始,pipe已经弃用了赞成then以完全相同的方式使用。