jQuery.ajax处理继续响应:“;成功:“;vs";。完成;?
我使用jQuery和AJAX已经有几个星期了,我看到了两种不同的方法来在调用后“继续”脚本:jQuery.ajax处理继续响应:“;成功:“;vs";。完成;?,ajax,jquery,Ajax,Jquery,我使用jQuery和AJAX已经有几个星期了,我看到了两种不同的方法来在调用后“继续”脚本:success:和.done 从本报告的概要中,我们得到: .done():说明:添加解析延迟对象时要调用的处理程序 success:(.ajax()选项):请求成功时调用的函数 因此,在AJAX调用完成/解决之后,两者都会做一些事情。我可以随意使用其中一个吗?当使用一个而不是另一个时有什么区别?success是jQuery中成功回调的传统名称,定义为ajax调用中的一个选项。但是,由于实现了$.Defe
success:
和.done
从本报告的概要中,我们得到:
.done():说明:添加解析延迟对象时要调用的处理程序
success:(.ajax()选项):请求成功时调用的函数
因此,在AJAX调用完成/解决之后,两者都会做一些事情。我可以随意使用其中一个吗?当使用一个而不是另一个时有什么区别?
success
是jQuery中成功回调的传统名称,定义为ajax调用中的一个选项。但是,由于实现了$.Deferreds
和更复杂的回调,done
是实现成功回调的首选方法,因为它可以在任何deferred
上调用
例如,成功:
$.ajax({
url: '/',
success: function(data) {}
});
例如,完成:
$.ajax({url: '/'}).done(function(data) {});
done
的好处在于$的返回值。ajax
现在是一个延迟承诺,可以绑定到应用程序中的任何其他地方。假设您想从几个不同的地方调用ajax。您可以让函数返回$.ajax
本身,并用done
、fail
、then
或其他方式绑定回调,而不是将success函数作为选项传递给进行此ajax调用的函数。请注意,始终
是一个回调,无论请求成功或失败都将运行该回调<代码>完成仅在成功时触发
例如:
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
});
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
});
这在可维护性方面的一个重要好处是,您已经将ajax机制包装到了特定于应用程序的函数中。如果您决定将来需要使用$.ajax
调用来进行不同的操作,或者您使用不同的ajax方法,或者您不再使用jQuery,那么您只需更改xhr\u get
定义(在上述示例中,确保返回一个承诺或至少一个done
方法)。整个应用程序中的所有其他引用可以保持不变
使用$还可以做很多(更酷的)事情。延迟,其中之一是使用管道触发服务器报告的错误失败,即使$。ajax
请求本身成功。例如:
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
});
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
});
阅读更多关于<代码>$的信息。请点击此处:
注意:从jQuery1.8开始,pipe
已被弃用,转而以完全相同的方式使用然后。如果您需要在ajax中使用async:false
,您应该使用成功
而不是.done
。否则您最好使用.done
。
这是来自:
从jQuery1.8开始,不推荐在jqXHR($.Deferred)中使用async:false;必须使用success/error/complete回调选项,而不是jqXHR对象的相应方法,如jqXHR.done()
来自
从jQuery 1.5开始,$.ajax()
返回的jqXHR对象实现Promise接口,为它们提供Promise的所有属性、方法和行为(有关更多信息,请参阅)。这些方法接受一个或多个函数参数,这些参数在$.ajax()
请求终止时调用。这允许您在单个请求上分配多个回调,甚至在请求完成后分配回调。(如果请求已经完成,则立即触发回调。)jqXHR对象的可用承诺方法包括:
jqXHR.done(function( data, textStatus, jqXHR ) {});
成功回调选项的替代构造,请参阅deferred.done()
,了解实现细节
jqXHR.fail(function( jqXHR, textStatus, errorThrown ) {});
jqXHR.always(function( data|jqXHR, textStatus, jqXHR|errorThrown ) { });
jqXHR.then(function( data, textStatus, jqXHR ) {}, function( jqXHR, textStatus, errorThrown ) {});
作为错误回调选项的替代构造,.fail()
方法替换了不推荐使用的.error()方法。有关实现的详细信息,请参阅deferred.fail()
jqXHR.fail(function( jqXHR, textStatus, errorThrown ) {});
jqXHR.always(function( data|jqXHR, textStatus, jqXHR|errorThrown ) { });
jqXHR.then(function( data, textStatus, jqXHR ) {}, function( jqXHR, textStatus, errorThrown ) {});
(在jQuery 1.6中添加)
作为完整回调选项的替代构造,.always()
方法替换了不推荐的.complete()
方法
为了响应成功的请求,函数的参数与.done()
:data、textStatus和jqXHR对象的参数相同。对于失败的请求,参数与.fail()
的参数相同:jqXHR对象、textStatus和errorThrown。有关实施的详细信息,请参阅deferred.always()
jqXHR.fail(function( jqXHR, textStatus, errorThrown ) {});
jqXHR.always(function( data|jqXHR, textStatus, jqXHR|errorThrown ) { });
jqXHR.then(function( data, textStatus, jqXHR ) {}, function( jqXHR, textStatus, errorThrown ) {});
合并了.done()
和.fail()
方法的功能,允许(从jQuery 1.8开始)操纵基础承诺。有关实施的详细信息,请参阅递延。然后()
jqXHR.fail(function( jqXHR, textStatus, errorThrown ) {});
jqXHR.always(function( data|jqXHR, textStatus, jqXHR|errorThrown ) { });
jqXHR.then(function( data, textStatus, jqXHR ) {}, function( jqXHR, textStatus, errorThrown ) {});
弃用通知:从jQuery 3.0开始,将删除jqXHR.success()
、jqXHR.error()
和jqXHR.complete()
回调。你可以用
jqXHR.done()
,jqXHR.fail()
,和jqXHR.always()
我想知道success:
/.done()
的交互是如何定义的,如果有的话。例如,success:
最近是不是作为第一个.done()
实现的?你的意思是如果你在一个ajax调用中同时获得了success:
和.done
?好问题。由于所有其他回调都是按绑定顺序调用的,我想是的,success
只是先调用。非常好的帖子!顺便说一句,在管道回调中,是否应该使用jqXHR参数调用管道函数以检查状态响应?例如:.pipe(函数(data,textStatus,jqXHR){if(jqXHR.status==200){…@Eder使用pipe
解决的场景是