2011-10-31 81 views
4

假設你有下面的一段代碼:您是否需要使用帶有單個延遲對象的jQuery.when?

function someProcess() { 
    var deferred = $.Deferred(); 

    apiCall(function (recvData) { 
     deferred.resolveWith(null, [recvData]); 
    }); 

    return deferred.promise(); 
} 

function mainFunction() { 
    $.when(someProcess()) 
     .then(someOtherProcess); 
} 

在這個例子中,我只需要等待一個推遲到解決。在這種情況下,就是寫的第二個功能如上對這樣寫的區別吧(如果有的話):

function mainFunction() { 
    someProcess() 
     .then(someOtherProcess); 
} 

我的意思是,因爲它清楚地表明,我們」我喜歡寫它的第一種方式重新使用jQuery延遲對象,但我很好奇,在這種情況下是否有必要。

編輯:我在then()調用中修復了一個錯字。感謝您的支持。

編輯:感謝您的答案nrabinowitz。我認爲你已經確定了我不確定使用when()和使用原始jQuery延遲對象實例的觀點。我再次修復我的代碼以返回一個承諾,而不是整個延期對象。這就是我現在在我的實際代碼中做的,只是忘了在這裏添加它。

+1

'someOtherProcess()'應該是'someOtherProcess'。在第一種情況下,您立即調用該函數。 –

+0

@RobW我認爲他應該立即調用它,因爲'$ .when'需要函數返回的延遲對象,而不是函數。 –

+0

@KevinB'someOtherProcess()'在'then'裏面,而不是'when'。 –

回答

2

我沒有使用自定義的延遲對象,但我的理解是,有在你的例子有兩點不同:

  • 使用$.when()允許你隨意添加更多的遞延對象由您的處理程序進行處理。很明顯,這不是什麼大問題,因爲你必須改變那一行代碼來添加更多的延遲。

  • $.when()僅獲取無極對象,而不是整個延遲對象,其中,如果我理解正確是一個一致性度量來隱藏該延遲的狀態改變的方法(例如resolve()),只露出處理鉤和狀態的檢查方法。這似乎是一種很好的做法,但在你的例子中,你可以通過調用someProcess().promise()而不是$.when(someProcess())來做同樣的事情。

因此,我認爲你是對的 - 這兩種方法都可以工作,但使用$.when()的主要好處是使代碼更易讀,並適當對其他程序員設定的預期。另外使用$.when()deferred.promise()還可以幫助防止某些不太能勝任的編碼人員以混亂的方式混淆延遲狀態。

+0

謝謝。我非常同意你所說的一切,所以我會繼續前進,讓這個問題得到解決。我很欣賞這些意見。 –

相關問題