ajax请求then和done的区别,jQuery.ajax处理继续响应:“success:”vs“.done”?

9304524258b457730b731fda2c8e3984.png

料青山看我应如是

success一直是jQuery成功回调的传统名称,定义为ajax调用中的一个选项。但是,由于实现了$.Deferreds更复杂的回调,因此done是实现成功回调的首选方法,因为它可以在任何回调上调用deferred。例如,成功:$.ajax({

  url: '/',

  success: function(data) {}});例如,完成:$.ajax({url: '/'}).done(function(data) {});好处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});在可维护性方面,这一点的一个重要好处是,您已将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});$.Deferred在这里阅读更多信息:http://api.jquery.com/category/deferred-object/注意:从jQuery 1.8开始,pipe已经弃用了赞成then以完全相同的方式使用。