我已经使用jQuery和AJAX几周了,我看到了两种不同的方法来在调用完成后"继续"脚本:success:
和.done
.
从jQuery文档的概要我们得到:
.done():说明:添加要在解析Deferred对象时调用的处理程序.
success:(.ajax()option):请求成功时调用的函数.
因此,在AJAX调用完成/解决之后,两者都做了一些事情.我可以随机使用其中一个吗?有什么区别,什么时候使用而不是另一个?
glo*_*tho 455
success
一直是jQuery成功回调的传统名称,定义为ajax调用中的一个选项.但是,由于实现了$.Deferreds
更复杂的回调,因此done
是实现成功回调的首选方法,因为它可以在任何回调上调用deferred
.
例如,成功:
$.ajax({
url: '/',
success: function(data) {}
});
Run Code Online (Sandbox Code Playgroud)
例如,完成:
$.ajax({url: '/'}).done(function(data) {});
Run Code Online (Sandbox Code Playgroud)
好处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
});
Run Code Online (Sandbox Code Playgroud)
在可维护性方面,这一点的一个重要好处是,您已将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
});
Run Code Online (Sandbox Code Playgroud)
$.Deferred
在这里阅读更多信息:http://api.jquery.com/category/deferred-object/
注意:从jQuery 1.8开始,pipe
已经弃用了赞成then
以完全相同的方式使用.
如果你需要async: false
在你的 ajax 中,你应该使用success
而不是.done
. 否则你最好使用.done
. 这是来自jQuery 官方网站:
从 jQuery 1.8 开始,不推荐使用带有 jqXHR ($.Deferred)的async: false;您必须使用成功/错误/完成回调选项而不是jqXHR 对象的相应方法,例如jqXHR.done()。
归档时间: |
|
查看次数: |
171109 次 |
最近记录: |