2014-03-06 55 views
25

jQuery文檔上jQuery.post()jQuery.post().done()和成功:

// Assign handlers immediately after making the request, 
// and remember the jqxhr object for this request 
var jqxhr = $.post("example.php", function() { 
    alert("success"); 
}) 
    .done(function() { 
    alert("second success"); 
    }) 
    .fail(function() { 
    alert("error"); 
    }) 
    .always(function() { 
    alert("finished"); 
}); 

// Perform other work here ... 

// Set another completion function for the request above 
jqxhr.always(function() { 
    alert("second finished"); 
}); 

有什麼success:參數和jqXHR.done()方法之間的差異;如果沒有,那麼jqXHR.done()方法的整個點是什麼?

回答

35

jQuery以前只有successerrorcomplete的回調函數。

然後,他們決定支持jqXHR對象的承諾,那就是當他們添加.done().fail(),.always()等......本着承諾API的精神。這些新方法與回調的用途大致相同,但形式不同。您可以使用更適合您的編碼風格的API風格。

隨着人們越來越熟悉promise,隨着越來越多的異步操作使用這個概念,我懷疑越來越多的人會隨着時間的推移而轉向promise API,但同時jQuery同時支持。

.success()方法已被棄用,取而代之的共同承諾對象的方法名。

jQuery doc,你可以看到諾方法如何將各種涉及回調類型:

jqXHR.done(功能(數據,textStatus,jqXHR){});替代 構造成功回調選項,.done()方法替換 棄用的jqXHR.success()方法。有關 實施細節,請參閱deferred.done()。

jqXHR.fail(function(jqXHR,textStatus,errorThrown){});對 錯誤回調選項的替代構造,.fail()方法 替換已棄用的.error()方法。有關 實施細節,請參閱deferred.fail()。

jqXHR.always(function(data | jqXHR,textStatus,jqXHR | errorThrown){ });完整回調選項的替代構造 .always()方法取代了不推薦使用的.complete()方法。

爲了響應成功的請求,函數的參數是與.done():data,textStatus和jqXHR對象相同的 。對於 失敗的請求,參數與.fail()的參數相同: jqXHR對象,textStatus和errorThrown。有關實施細節,請參閱deferred.always() 。

jqXHR.then(功能(數據,textStatus,jqXHR){},功能(jqXHR, textStatus,errorThrown){});集成了 .done()和.fail()方法的功能,允許(作爲jQuery 1.8) 潛在承諾被操縱。有關 實施細節,請參閱deferred.then()。

如果要以更符合ES6 Promise標準的方式進行編碼,那麼在這四個選項中,只能使用.then()

6

兩個.done().success()有回調函數,它們的功能基本上相同的方式。

這裏的documentation。不同的是,.success()從jQuery 1.8開始已棄用。您應該改用.done()

如果你不想點擊鏈接:

取消通知

jqXHR.success(),jQuery的1.5引入了jqXHR.error()jqXHR.complete()回調 方法被棄用的jQuery 1.8 。要 準備你的代碼爲他們的最終消除,使用jqXHR.done()jqXHR.fail()jqXHR.always()來代替。

0

From the doc

jqXHR.done(功能(數據,textStatus,jqXHR){});

一種替代構建體的成功回調選項,中,.done() 方法替換棄用 jqXHR.success()方法。有關實現細節,請參閱 deferred.done()。

這只是成功回調選項的替代方案,jqXHR.success()已棄用。

10

優先於回調函數的Promise的原因是有多個回調並避免像Callback Hell這樣的問題。

回調地獄(詳情請參閱http://callbackhell.com/): 異步JavaScript或使用回調的javascript很難直觀地理解。大量的代碼最終看起來像這樣:

asyncCall(function(err, data1){ 
    if(err) return callback(err);  
    anotherAsyncCall(function(err2, data2){ 
     if(err2) return calllback(err2); 
     oneMoreAsyncCall(function(err3, data3){ 
      if(err3) return callback(err3); 
      // are we done yet? 
     }); 
    }); 
}); 

利用上述代碼承諾可以改寫爲如下:

asyncCall() 
.then(function(data1){ 
    // do something... 
    return anotherAsyncCall(); 
}) 
.then(function(data2){ 
    // do something... 
    return oneMoreAsyncCall();  
}) 
.then(function(data3){ 
    // the third and final async response 
}) 
.fail(function(err) { 
    // handle any error resulting from any of the above calls  
}) 
.done();