$.ajax的success和.done()方法有什么区别?

108

谁可以帮助我?
我不明白 $.ajax 中的 success.done() 的区别。

如果可能的话,请提供示例。


1
请在 http://api.jquery.com/jQuery.ajax/ 页面查看相关的编程文档。 - Poonam Bhatt
2
好的,这是jQuery 1.8 :) 自从jQuery 1.5中$.ajax返回一个promise后,为了保持一致性(使用deferred接口),这是一个简单的替换:done()代替success(),fail()代替error(),always()代替complete()。 - Fabrizio Calderan
2
真正的变化是您可以通过编程方式附加多个回调。请查看$.Deferred文档页面。 - Fabrizio Calderan
请查看以下链接以获得更好的解释:https://dev59.com/6WUq5IYBdhLWcg3wJNBA#14754681 - user
显示剩余3条评论
4个回答

116

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 对象。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 扩展了Promise的语法(和错误处理):

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); 
}

在发出请求之前创建函数,并在发出请求后设置函数。看起来两者都是一样的...你能给我展示其他的区别吗? - suhailvs
1
@suhail - 实际上没有什么区别;在jQuery 1.6中有success,而在jQuery 1.8中被done替换了。它们的工作方式相同,但是done与jQuery的其他部分更加一致。 - Keith
@Keith,所以今天使用.done和使用success是一样的吗?还是有其他更新的东西? - Roxy'Pro
@Roxy'Pro 当我回答这个问题时,它已经过时了,我肯定不会在2018年使用它。.done是jQuery早期(现在已经死胡同)尝试成为Promise的一部分,而现在Promise已经有了相当全面的语言支持。在新项目中,我会使用const response = await fetch(...)代替。 - Keith

6
简而言之,将成功回调函数从ajax函数中解耦出来,以便稍后可以添加自己的处理程序而不必修改原始代码(观察者模式)。
请在此处找到更详细的信息:https://dev59.com/6WUq5IYBdhLWcg3wJNBA#14754681

1
以下是该示例将 done => success、fail => error 和 always => complete 的等价关系映射出来的内容。 - StuartLC
25
这个答案没有抓住重点。success:作为参数和在 jqXHR 上作为方法的 .success() 之间有区别。后者正在被弃用,但前者是OP所问的内容。 - Alnitak
2
成功/错误/完成已被弃用,基于AJAX状态更改;done/fail/always基于jQuery Deferred状态更改。请参阅http://api.jquery.com/category/deferred-object/. - mickeyreiss
30
很难相信一个错误解读问题的答案成为了得票最高且被采纳的解决方案... - Transcendence

6

.success() 只有在您的 Web 服务器响应 200 OK HTTP 标头时才会被调用 - 基本上是当一切正常时。

附加到 done() 的回调函数将在延迟解决时触发。附加到 fail() 的回调函数将在延迟被拒绝时触发。

promise.done(doneCallback).fail(failCallback)

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

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

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接