jQuery.ajax处理继续响应:“成功:”vs“.done”?

问题描述:

我一直在使用jQuery和AJAX几周,现在我看到了两种不同的方式来在调用完成后“继续”脚本:success:.donejQuery.ajax处理继续响应:“成功:”vs“.done”?

从从jQuery documentation我们得到的简介:

.done():说明:添加处理程序当递延对象是解决被调用。

成功:(.ajax()选项):如果请求成功,将被调用的函数。

因此,两者都在AJAX调用完成/解决之后做了一些事情。我可以随意使用其中一种吗?有什么区别,什么时候使用一个而不是另一个?

success一直是jQuery中成功回调的传统名称,定义为ajax调用中的一个选项。但是,自从执行$.Deferreds以及更复杂的回调以来,done是实现成功回调的首选方式,因为它可以在任何deferred上调用。

例如,成功:

$.ajax({ 
    url: '/', 
    success: function(data) {} 
}); 

例如,做到:

$.ajax({url: '/'}).done(function(data) {}); 

的好处约done是,$.ajax返回值现在是可以绑定到一个递延承诺您应用程序中的任何其他位假设你想从几个不同的地方进行这种Ajax调用。而不是将您的成功函数作为ajax调用函数的选项传递,您可以让函数本身返回$.ajax并将您的回调函数与donefail,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 
}); 

在这里阅读更多关于$.Deferredhttp://api.jquery.com/category/deferred-object/

注意:在jQuery 1.8,pipe一直赞成以完全相同的方式使用then的弃用。

+2

我不知道如何定义'success:'/'.done()'的相互作用。例如。是'成功':这些日子刚刚实现为第一个'.done()'? – 2012-01-12 19:15:53

+5

你是说如果你在ajax调用中同时拥有'success:'和'.done'?好问题。由于所有其他回调函数都是按照它们绑定的顺序调用的,所以我的猜测是肯定的,“成功”只是先调用。 – glortho 2012-01-12 19:24:44

+1

是的,那的确会出现这种情况:http://jsfiddle.net/9L7dD/ – Adam 2014-04-19 14:35:28

如果你需要在你的ajax中使用async: false,你应该使用success而不是.done。否则你最好使用.done。 这是jQuery official site

对于jQuery 1.8,使用异步的:假与jqXHR($ .Deferred)已被弃用;你必须使用成功/错误/完整呼选项,而不是的jqXHR对象,如jqXHR.done()的相应方法。