$.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
被替换为 done
,error
被替换为 fail
,complete
被替换为 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
现在已弃用,取而代之的是使用 then
的 Promise
语法:
$.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); );
这是值得采用的,因为 async
和 await
扩展承诺改进语法(和错误处理):
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”?
angular2 测试中 fakeAsync 的 tick() 和 done() 有啥区别?
为啥我的 jQuery .ajax() 路由的 .done() 方法没有在我的 NodeJS、Express 和 Mongoose 项目中触发?