jQuery.ajax处理继续响应:“;成功:“;vs";。完成;?

jQuery.ajax处理继续响应:“;成功:“;vs";。完成;?,ajax,jquery,Ajax,Jquery,我使用jQuery和AJAX已经有几个星期了,我看到了两种不同的方法来在调用后“继续”脚本:success:和.done 从本报告的概要中,我们得到: .done():说明:添加解析延迟对象时要调用的处理程序 success:(.ajax()选项):请求成功时调用的函数 因此,在AJAX调用完成/解决之后,两者都会做一些事情。我可以随意使用其中一个吗?当使用一个而不是另一个时有什么区别?success是jQuery中成功回调的传统名称,定义为ajax调用中的一个选项。但是,由于实现了$.Defe

我使用jQuery和AJAX已经有几个星期了,我看到了两种不同的方法来在调用后“继续”脚本:
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
解决的场景是