2012-01-13 216 views
89

任何人都可以帮助我吗?
我无法理解$.ajaxsuccess.done()之间的差异。

如果可能请举例。

+0

您在哪里阅读了关于$ .ajax()的done()方法? AFAIK done方法与$ .Deferred对象有关。也许你在谈论.complete()而不是? http://api.jquery.com/jQuery上的 – fcalderan 2012-01-13 08:37:54

+1

。ajax/page – 2012-01-13 08:39:36

+2

好吧,它是jQuery 1.8 :)由于$ .ajax从jQuery 1.5返回一个承诺,这是一个简单的替换问题的一致性问题(使用延迟接口):done()取代success(),失败()for error()和always()for complete() – fcalderan 2012-01-13 08:42:12

回答

8

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

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

+1

而在它下面的例子中,映射出done => success,fail => error的等价性,并且总是=>完成 – StuartLC 2012-01-13 08:43:13

+23

这个答案忽略了这一点。 'success:'用作参数,'.success()'作为'jqXHR'上的方法是有区别的。后者正在被弃用,但前者是OP所问的。 – Alnitak 2012-08-23 08:39:29

+1

成功/错误/完成不推荐使用,并基于AJAX状态更改;完成/失败/总是基于jQuery延迟状态更改。请参阅http://api.jquery.com/category/deferred-object/。 – mickeyreiss 2012-12-29 02:22:45

90

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

在jQuery中1.8 jqXHR对象success(由$.ajax返回)上替换为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 object兼容性。递延(现在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); 
} 
+0

在发出请求之前创建函数,并在发出请求后设置函数。看起来像两个一样...你会告诉我一些其他的区别吗? – suhailvs 2013-07-17 11:24:22

+0

@suhail - 这里没有任何东西;在jQuery 1.6中有'成功',在jQuery 1.8中被'done'取代。他们以相同的方式工作,但“完成”与jQuery的其他部分更加一致。 – Keith 2013-07-17 13:02:44

0

success是当请求成功,是$.ajax呼叫的一部分被调用的回调。 done实际上是由$.ajax()返回的jqXHR对象的一部分,并且替换了jQuery 1.8中的success

5

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

当解析延迟时,附加到done()的回调将被触发。附加到失败()的回调将在延迟被拒绝时触发。

promise.done(doneCallback).fail(failCallback) 

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

值得注意的是,当格式错误的JSON以200/OK状态码发回时,.success()不会被调用。具体来说,我遇到了一个问题,生成NaN值的Web服务器后端代码并将它们序列化为JavaScript NaN(即作为符号,而不是字符串'NaN'),这实际上是无效的JSON - 所以将响应解析为JSON失败并且.fail()被执行,但是响应状态是200.但是,成功只用OK状态代码来调用仍然是事实;只是想指出,只是因为没关系,并不意味着它是'成功';) – Kasapo 2015-12-23 22:05:48

相关问题