$.ajax 的成功和 .done() 方法有啥区别

Posted

技术标签:

【中文标题】$.ajax 的成功和 .done() 方法有啥区别【英文标题】:what is difference between success and .done() method of $.ajax$.ajax 的成功和 .done() 方法有什么区别 【发布时间】:2012-02-09 11:52:16 【问题描述】:

谁能帮帮我? 我无法理解success.done() 之间的区别$.ajax

如果可能,请举例说明。

【问题讨论】:

您从哪里了解到 $.ajax() 的 done() 方法? AFAIK done 方法与 $.Deferred 对象有关。也许您是在谈论 .complete() 吗? 在api.jquery.com/jQuery.ajax页面 好的,它是 jQuery 1.8 :) 由于 $.ajax 从 jQuery 1.5 返回一个承诺,这是对一致性问题的简单替换(使用 deferred 的接口):done() 代替成功()、fail() 用于 error() 和 always() 用于 complete() 真正的变化是您可以以编程方式附加多个回调。查看 $.Deferred 文档页面。 jQuery.ajax handling continue responses: "success:" vs ".done"?的可能重复 【参考方案1】:

success 仅在 AJAX 调用成功时触发,即最终返回 HTTP 200 状态。 error 在失败时触发,complete 在请求完成时触发,无论成功与否。

在 jQuery 1.8 中,jqXHR 对象(由 $.ajax 返回)上的 success 被替换为 doneerror 被替换为 failcomplete 被替换为 always

但是,您仍然应该能够使用旧语法初始化 AJAX 请求。所以这些做类似的事情:

// set success action before making the request
$.ajax(
  url: '...',
  success: function()
    alert('AJAX successful');
  
);

// set success action just after starting the request
var jqxhr = $.ajax( "..." )
  .done(function()  alert("success"); );

此更改是为了与 jQuery 1.5 的 deferred object 兼容。 Deferred(现在是 Promise,在 Chrome 和 FX 中具有完整的原生浏览器支持)允许您链接异步操作:

$.ajax("parent").
    done(function(p)  return $.ajax("child/" + p.id); ).
    done(someOtherDeferredFunction).
    done(function(c)  alert("success: " + c.name); );

与使用success 获得的嵌套回调金字塔相比,此函数链更易于维护。

但是,请注意 done 现在已弃用,取而代之的是使用 thenPromise 语法:

$.ajax("parent").
    then(function(p)  return $.ajax("child/" + p.id); ).
    then(someOtherDeferredFunction).
    then(function(c)  alert("success: " + c.name); ).
    catch(function(err)  alert("error: " + err.message); );

这是值得采用的,因为 asyncawait 扩展承诺改进语法(和错误处理):

try 
    var p = await $.ajax("parent");
    var x = await $.ajax("child/" + p.id);
    var c = await someOtherDeferredFunction(x);
    alert("success: " + c.name);

catch(err)  
    alert("error: " + err.message); 

【讨论】:

请求前创建函数,请求后设置函数。看起来两者都是一样的......你能告诉我一些不同的地方吗??? @suhail - 真的没有;在 jQuery 1.6 中有 success,在 jQuery 1.8 中被 done 取代。它们的工作方式相同,但done 与 jQuery 的其余部分更加一致。 @Keith 所以今天,使用 .done 和使用成功一样吗?还是有其他更新的东西? @Roxy'Pro 这在我回答时已经过时了,我当然不会在 2018 年使用它。.done 是 jQuery 早期(现在是死胡同)对 Promise 的尝试现在有相当全面的语言支持。在新项目中,我会改用const response = await fetch(...)【参考方案2】:

简而言之,将成功回调函数与 ajax 函数解耦,这样以后您就可以在不修改原始代码的情况下添加自己的处理程序(观察者模式)。

请从这里找到更多详细信息:https://***.com/a/14754681/1049184

【讨论】:

在它下面的示例映射出完成 => 成功、失败 => 错误和始终 => 完成的等价性 这个答案没有抓住重点。用作参数的success: 和用作jqXHR 的方法的.success() 之间存在差异。后者已被弃用,但前者是 OP 所要求的。 成功/错误/完成已被弃用并基于 AJAX 状态更改; done/fail/always 基于 jQuery Deferred 状态更改。见api.jquery.com/category/deferred-object。 我无法相信一个曲解问题的答案既是最高票数又是公认的解决方案......【参考方案3】:

success 是请求成功时调用的回调,是$.ajax 调用的一部分。 done实际上是$.ajax()返回的jqXHR对象的一部分,在jQuery 1.8中替换了success

【讨论】:

【参考方案4】:

.success() 仅在您的网络服务器响应 200 OK HTTP 标头时才会被调用 - 基本上是在一切正常的情况下。

附加到 done() 的回调将在 deferred 解决时被触发。当 deferred 被拒绝时,附加到 fail() 的回调将被触发。

promise.done(doneCallback).fail(failCallback)

.done() has only one callback and it is the success callback

【讨论】:

值得注意的是,当使用 200/OK 状态代码返回格式错误的 JSON 时,不会调用 .success()。具体来说,我遇到了一个问题,网络服务器后端代码生成 NaN 值并将它们序列化为 javascript NaN(即作为符号,而不是字符串'NaN'),这实际上是无效的 JSON - 所以将响应解析为 JSON失败并且 .fail() 被执行,但响应状态是 200。但它仍然是真的只有用 OK 状态代码调用成功;只是想指出,仅仅因为它还可以,并不意味着它'成功';)

以上是关于$.ajax 的成功和 .done() 方法有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

jQuery.ajax 处理继续响应:“成功:”与“.done”?

成功ajax重试后没有.done

jquery中的done和always解决ajax问题

ajax之后的done()方法和fail()方法

angular2 测试中 fakeAsync 的 tick() 和 done() 有啥区别?

为啥我的 jQuery .ajax() 路由的 .done() 方法没有在我的 NodeJS、Express 和 Mongoose 项目中触发?