2014-07-10 267 views
3

想象一下,我有X,YZ函數,所有函數都返回並準備好鏈接。我想要做的是在完成並處理錯誤後通知進度。什麼是更好的寫和爲什麼(有什麼後果):如何從JavaScript函數返回承諾?

A.

function my_func(index, size){ 
    return X 
     .then(Y) 
     .then(Z) 
     .then(
      function(data){ 
       var dfd = new $.Deferred(); 
       dfd.notify("progress", index/size, 'OK'); 
       dfd.resolve(data); 
       return dfd.promise(); 
      }, 
      function(){ 
       return handleError(arguments, size, index); 
      } 
     ); 
} 

B.

function my_func(index, size){ 
    var dfd = new $.Deferred(); 
    X 
    .then(Y) 
    .then(Z) 
    .then(
     function(data){ 
      dfd.notify("progress", index/size, 'OK'); 
      dfd.resolve(data); 
     }, 
     function(){ 
      return handleError(arguments, size, index); 
     } 
    ) 
    return dfd.promise(); 
} 

此外,之間有什麼區別:

X.then(Y).then(Z); 

和:

$.when(X).then(Y).than(Z); 

如果$.when一部分是不必要的,爲什麼doeas它在jQuery的存在呢?

+0

評論從@Benjamin Gruenbaum評論中刪除。 –

+0

你說得對。對不起! –

回答

0

後者是不必要的。這只是額外的罪過。 $.when對於將值轉換爲承諾和聚合很有用。

這裏是一個平均$.when用例:

$.when($.get(...),$.get(...)).then(function(firstResult,secondResult){ 
    // access both results here 
}); 

你可以在這裏使用兩個結果,都已經完成。

至於第一個問題 - 基本上B.第一個選項是deferred anti pattern,最好避免。關於爲什麼,請參閱link to it問題。

+0

感謝您的解釋,我的問題的第一部分呢? – mnowotka

+0

@mnowotka對不起,我錯過了 - 請參閱我最近的編輯。 –

+0

在這裏同意@BenjaminGruenbaum,第二種方法看起來更乾淨,因爲'my_func'函數可以正確包裝裏面發生的事情。但是......總而言之,我認爲你錯誤地認爲'.then()'鏈將按順序發生,只有當'Y'被解析,那麼'Z'纔會發生。情況並非如此,在兩種情況下,'.then()都會在'X'解析時發生。我也是在這個印象中,但看到這個JSFiddle(按第二個按鈕):http://jsfiddle.net/vH84q/1/(編輯:讓瀏覽器控制檯打開,看看發生了什麼。) – UweB

0

主要區別在於,您依靠的是X是具有方法then的對象。 將非延遲/承諾對象傳遞給$.when將視爲解決Deferred,我個人更喜歡它,因爲它使得函數之間的耦合更鬆散。

+0

一個更正確的術語可能會「實現」,它會將其視爲已履行延期。 –

+0

我同意,但我實際上引用了jQuery API文檔;)「...它將被視爲已解決的Deferred ...」,請參閱http://api.jquery.com/jQuery.when/ – UweB

+0

相同評論在這裏 - 我很欣賞'when'的用法的解釋,但對我來說,我的問題的第一部分更重要:) – mnowotka