【问题标题】: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() 吗?
  • 好的,它是 jQuery 1.8 :) 由于 $.ajax 从 jQuery 1.5 返回一个承诺,这是对一致性问题的简单替换(使用 deferred 的接口):done() 代替成功()、fail() 用于 error() 和 always() 用于 complete()
  • 真正的变化是您可以以编程方式附加多个回调。查看 $.Deferred 文档页面。

标签: jquery jquery-deferred


【解决方案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://stackoverflow.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 状态代码调用成功;只是想指出,仅仅因为它还可以,并不意味着它'成功';)
    猜你喜欢
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 2017-09-18
    相关资源
    最近更新 更多