2011-11-06 124 views
9
$.ajax("example.php").done(function() 
{ 
    alert(...); 
}).fail(function() 
{ 
    alert(...); 
}).always(function() 
{ 
     alert(...); 
}); 

VSjQuery推遲優勢?

$.ajax("example.php", 

     success: function() 
     { 
      alert(''); 
     }, 
     error: function() 
     { 
      alert(''); 
     }, 
     complete: function() 
     { 
      alert(''); 
     } 
); 

對不起,我不能看不到任何優勢

能否請您解釋一下嗎?

或者也許你可以給我例子的前者不能由後者完成...?

+2

聳聳肩......我想前者可能會感覺更多的jQuery-y。我認爲這不僅僅是一種文體上的優勢。 –

回答

5

對於初學者來說,第二個代碼塊甚至在語法上都不是有效的。我稱之爲第一:P


但在所有的嚴重性的一個優點:

這只是爲了實現相同的最終結果不同的語法。一個直接的好處是,你可以線了多種功能,每個結果與延期:

$.get("example.php").done(function() 
{ 
    alert("success 1"); 
}).done(function() 
{ 
    alert("success 2"); 
}); 

,否則你就必須做到這一點,像這樣:

function done1() 
{ 
    alert('success 1'); 
} 
function done2() 
{ 
    alert('success 2'); 
} 

$.ajax('example.php', 
{ 
    success: function() 
    { 
     done1.apply(this, arguments); 
     done2.apply(this, arguments); 
    } 
}); 

等優勢,從報價How can jQuery deferred be used?

  • Deferreds非常適合當t他的任務可能會或可能不會異步操作,並且您希望將該條件從代碼中抽象出來。
  • ...從多個來源提取數據。在下面的示例中,我將獲取現有應用程序中用於在客戶端和REST服務器之間進行驗證的多個獨立JSON模式對象。在這種情況下,我不希望瀏覽器端應用程序在加載所有模式之前開始加載數據。 $ .when.apply()。然後()是完美的。
  • 推遲可以用來代替互斥。這與多個ajax使用場景基本相同。
+0

仍然很難看到任何區別。因爲當即時通訊運行「example.php」即時通訊等待答案(成功或無所謂)。我正在尋找一些硬性優勢... :) –

+1

請參閱我的編輯爲fancier案件。不喜歡延期的API?不要使用它。 –

+1

我剛剛從http://stackoverflow.com/questions/4869609/how-can-jquery-deferred-be-used中看到了這個例子,這行'return cache [val] || $ .ajax('/ foo /',...'讓我意識到我可以在callbackFunction **中使用'when' REGARDLESS **可以來自緩存或來自ajax調用的響應...很好。 –

4

我想說,延期對象只是jQuery演變的另一個步驟。

在它們之前,只能將回調傳遞給配置對象中的$.ajax。有了延期後,您現在可以處理所有的異步甚至同步執行,從而實現更統一的界面。這是優勢:簡化統一

引入on時發生了類似的情況。與bind相比,on沒有真正的優勢,但它簡化了事件處理,因爲它結合了bind,livedelegate的功能。結果是用於事件處理的統一API。我可以使用兩次相同的功能,onbinddelegate

以類似的方式,如果我想創建兩個相關的Ajax調用,我可以使用兩個$.ajax調用加上$.when,這是我熟悉的並且與進行一個或多個調用沒有任何區別,或者我在另一個內嵌一個呼叫,這要求我以不同的方式思考執行的方式。

延遲對象是異步代碼執行的統一通用方法。這並不意味着先前添加回調的方式應該被刪除,它會破壞很多代碼。除此之外,它仍然更接近原始對象的方法,有些人可能更喜歡這種方法。

+0

推遲的對象是否僅用於異步調用? –

+0

我還沒有想到當我必須使用'when'時我看到了一些例子,可以讓'then'在沒有'when'的時候......可以解釋嗎? –

+0

不,這就是爲什麼我把它改爲「異步甚至是同步執行」......我只是經常以異步方式使用它,我認爲這是它們的主要目的 –

1

延遲對象的主要優點是可以傳遞它們,因此對於ajax執行代碼不知道還有其他人對回調感興趣或者不想對其進行硬編碼的複雜情況,它可以傳遞推遲對象感興趣的插件/模塊代碼。

例如

var defer = $.get("example.php"); 
for(var i=0; i<ajax_observers.length;i++){ 
    ajax_observers[i].hook(defer) 
} 

同樣的事情可以通過回調來完成,但隨後你將不得不寫的接口,用於從觀察者的回調函數,這是不靈活,遞延觀察家可以做延期對象的東西。

+0

like'$(「a」)。click(preExistsingfunc)'??? –

+0

對象在'ajax_observers'中是什麼樣的? –

+0

是你嗎?在這裏使用插件? –