2013-06-27 23 views
5

我有一個關於dojo/Deferred的問題。我將從這個問題開始,然後詳細說明我在做什麼:如何解決或拒絕Dojo Deferred對象後執行通用代碼?

有沒有辦法執行相同的代碼行,而不管延遲的結果如何排序finally一個try...catch聲明?從我讀過的東西看,似乎並不存在,但也許我正在理解文檔錯誤,並希望通過SO社區進行驗證。

下面是我在做什麼:

在道場1.9(也適用於1.8),裝我的一些數據之前實例化一個dojox.widget.Standby(加載覆蓋)的contentPane中。一旦推遲的呼叫完成,我想隱藏我的覆蓋,如下所示:

standby = new Standby({ 
    ... // standby props 
}); 
this.addChild(standby); 
standby.show(); 

queryResults = grid.store.query({ 
    ... // query props 
}); 
queryResults.then(function (results) { 
    if (results) { 
     ... // do something 
    } 

    standby.hide(); 
}, function (error) { 
    ... // handle error 

    standby.hide(); 
}); 

這工作正常;不過,大概我可以在延遲完成之後實現一些進程,這些進程需要幾行代碼而不是一行代碼,而且我不想複製這些代碼行。另一種方法是創建一個私有函數,並在每個塊中用一行代碼來調用它,但如果有更好的方法,我寧願採用這種方法。

在此先感謝!

回答

5

無論基礎Deferred成功還是失敗,您都可以使用Promises API的always方法執行函數。

queryResult 
    .then(onSuccess, onFailure) 
    .always(function() { 
     standby.hide(); 
    }); 
2

這是一個很好的問題。 dojo/Deferred對象將在調用Deferred#then時返回另一個Deferred對象。這允許您鏈接一個不同的多個回調,這些回調是按照連續順序觸發的。因此,我相信你可以做這樣的事情:

queryResults.then(function (results) { 
    if (results) { 
     ... // do something 
    } 
}, function (error) { 
    ... // handle error 
}).then(function(data){ 
    // This will be fired with data returned from the previous callback. 
    standby.hide(); 
}); 

可以see this example fiddle,說明類似的,雖然簡單,使用情況下,無論是否延期被拒絕或解決,回調到第二Deferred#then被解僱在初始錯誤/成功回調之後。

+0

你和@Lucas已經回答了我的問題,因爲這兩個答案都是正確的。我給@盧卡斯給了'最佳答案',因爲我認爲'總是'代表了一個比'then'更清晰的意圖。但我對它的正確性投了你的答案。 – David

-1
var deferred = new Deferred(); 
deferred.promise.always(function() { alert('ciao'); }); 
+0

這似乎沒有在現有答案上添加任何內容。 – Bergi

+0

是的,它延遲了promise,所以我使用promise屬性而不必調用.then()函數並設置回調函數。 – max4ever

+0

其他答案使用'.then()',因爲OP需要那些取決於結果的回調函數。 – Bergi

相關問題