jQuery.ajax处理继续响应:"success:"vs".done"?

Cla*_*dio 303 ajax jquery

我已经使用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以完全相同的方式使用.

  • 你的意思是如果你在ajax调用上同时拥有`success:`和`.done`?好问题.由于所有其他回调都是按照它们被绑定的顺序调用的,我的猜测是肯定的,首先调用`success`. (6认同)
  • 是的,确实会出现这种情况:http://jsfiddle.net/9L7dD/ (3认同)
  • 我想知道如何定义`success:`/..done()`的交互.例如,`success:`这些天刚刚实现为第一个`.done()` (2认同)

Ami*_*ian 5

如果你需要async: false在你的 ajax 中,你应该使用success而不是.done. 否则你最好使用.done. 这是来自jQuery 官方网站

从 jQuery 1.8 开始,不推荐使用带有 jqXHR ($.Deferred)的async: false;您必须使用成功/错误/完成回调选项而不是jqXHR 对象的相应方法,例如jqXHR.done()