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

我已经使用了jQuery和AJAX几个星期了,我看到了两种不同的方式来在调用完成之后“继续”脚本: success:.done

从jQuery文档的大纲我们得到:

.done():描述:添加处理程序,当Deferred对象被解析时被调用。

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

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

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

例如,成功:

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

例如,完成:

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

关于done$.ajax$.ajax的返回值现在是一个延迟的承诺,可以绑定到您的应用程序中的任何其他地方。 所以假设你想从几个不同的地方做出这个Ajax电话。 而不是传递你的成功函数作为一个选项,使这个ajax调用的函数,你可以让该函数返回$.ajax本身,并绑定你的回调donefailthen ,或其他任何。 请注意,无论请求是成功还是失败, 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还可以做更多(更酷)的事情,即使在$.ajax请求本身成功的情况下,也可以使用pipe来触发服务器报告的错误。 例如:

 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 here: http : $.Deferred

注意 :从jQuery 1.8开始, pipe已经被弃用,而用完全相同的方式。