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


102

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

如有可能,请举例。


您从何处了解到$ .ajax()的done()方法?AFAIK done方法与$ .Deferred对象有关。也许您是在谈论.complete()?
Fabrizio Calderan 2012年


2
好的,是jQuery 1.8 :)由于$ .ajax从jQuery 1.5返回了promise,这是一个简单的替换,以解决一致性问题(使用deferred接口):done()代替了success(),fail()表示错误()和always()for complete()
Fabrizio Calderan 2012年

2
真正的变化是您可以以编程方式附加多个回调。查看$ .Deferred文档页面。
Fabrizio Calderan 2012年

Answers:


8

简而言之,将成功回调函数与ajax函数分离,以便稍后您可以添加自己的处理程序,而无需修改原始代码(观察者模式)。

请从此处找到更多详细信息:https : //stackoverflow.com/a/14754681/1049184


1
在其下,该示例绘制了完成=>成功,失败=>错误和始终=>完成的
等价关系

25
这个答案没有重点。在上success: 用作参数和.success()用作方法之间有区别jqXHR。后者已被弃用,但前者是OP所要求的。
Alnitak

2
不建议使用成功/错误/完成,并且基于AJAX状态更改;完成/失败/总是基于jQuery Deferred状态更改。请参阅api.jquery.com/category/deferred-object
mickeyreiss

28
我不敢相信会误解该问题的答案既是投票最高的也是公认的解决方案...
超越2013年

108

success仅在AJAX调用成功(即最终返回HTTP 200状态)时触发。error如果失败以及complete请求结束(无论成功与否),都会触发。

在jQuery的1.8 jqXHR对象(通过返回$.ajaxsuccess被替换doneerrorfailcompletealways

但是,您仍然应该可以使用旧语法初始化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现在不赞成使用该Promise语法,then而是使用:

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

在请求之前创建函数,并在请求之后设置函数。看起来两者相同...您能告诉我其他差异吗???
suhailvs

@suhail-真的没有;在jQuery 1.6中,有一个success在jQuery 1.8中被取代done。它们以相同的方式工作,但done与jQuery的其余部分更加一致。
基思(Keith)

@Keith所以今天,使用.done与使用成功相同吗?还是还有其他更新?
Roxy'Pro

@ Roxy'Pro当我回答它时已经过时了,我当然不会在2018 .done年使用它。是jQuery的早期(现在是死胡同),后来Promise有了相当全面的语言支持。在新项目中,我会const response = await fetch(...)改用。
基思

6

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

解析延迟后,将触发完成()上附加的回调。当拒绝延迟时,将触发fail()附加的回调。

promise.done(doneCallback).fail(failCallback)

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

3
值得注意的是,当以200 / OK状态码发送回格式错误的JSON时,不会调用.success()。具体来说,我遇到了一个网络服务器后端代码生成NaN值并将其序列化为实际上不是有效JSON的javascript NaN(即,作为符号,而不是字符串'NaN')的问题,因此将响应解析为JSON失败并执行了.fail(),但响应状态为200。但是,仅通过OK状态代码调用成功仍然是事实;只是想指出那是因为没关系,并不意味着它就成功;)
Kasapo

1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.