2012-01-13 220 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

相關問題