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
本身,并绑定你的回调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
还可以做更多(更酷)的事情,即使在$.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
已经被弃用,而用完全相同的方式。