2016-07-29 22 views
1

我有一個ES6可執行/承諾鏈的情況。鏈中的第一個承諾實際上是一種異步方法,它確定緩存是否可能首先被刷新,並且鏈中的後續方法進行實際刷新。有沒有更優雅和直觀的方法來打破ES6 Promise鏈?

問題是,如果第一種方法確定我不應該實際刷新緩存,我想要從鏈中彈出......我不需要做其餘的事情。

我能夠得到這個工作的唯一方法是將測試方法的結果和每個後續的.then()鏈中的結果存儲起來,以測試是否實際執行某些操作或返回簡單的Promise.resolve(null)。

這看起來像一堆額外的愚蠢的代碼,不應該真的需要在那裏。

我的代碼如下工作....錯誤處理是正確的....但有沒有更好的方式來編碼這種模式,你只想有條件地繼續鏈?一種不涉及存儲答案然後在每個then()上強制使用Promise.resolve()的方法?

function asyncRefreshCache(wDb, forceRefresh) { 
    var cachedDataVersions; 
    var allowRefresh; 
    return wDb.asyncCacheRefreshAllowed(forceRefresh) // Here I test whether I am allowed to really refresh the cache. 
     .then(function (ar) { 
      allowRefresh = ar; 
      return allowRefresh 
       ? wDb.asyncGetCacheDataVersionsForRefresh() // Only do this if allowed above. 
       : Promise.resolve(null); //Yuck. Would love to just break out. But how? 
     }) 
     .then(function (dataVersions) { 
      cachedDataVersions = dataVersions; 
      return allowRefresh 
       ? asyncServerFlexSearch({ dataVersions: dataVersions, includeInactiveFlag: true, onLoadFlag: true }) // Only do this if allowed above. 
       : Promise.resolve(null); //Yuck. Would love to just break out. But how? 
     }) 
     .then(function (serverResponse) { 
      return allowRefresh 
       ? wDb.asyncMergeCleanDataFromServerToCache(cachedDataVersions, serverResponse) // Only do this if allowed above. 
       : Promise.resolve(null); //Yuck. Would love to just break out. But how? 
     }); 
} 

編輯:這個問題被標記爲重複,因爲類似問題關於Q Promises和JQuery Promises。而JQuery Promise並非真正的承諾。所以我最初的希望是ES6 Promise的規範和實現將適應這個看似重要的需求和用例。看起來可能並非如此。所以對這些問題的答案可能是這個問題的「正確」答案,但它們不是關於ES6承諾的。這對我來說似乎不同。

+0

處理錯誤和處理錯誤消息或拒絕承諾的原因,我不認爲這件事確實是重複的是不是ES6承諾,請模式完全一樣。 – Bergi

回答

3

但有沒有更好的方式來編碼這種模式,你只有 想有條件地繼續鏈?

你可以throwError或使用Promise.reject().then(),在.catch()

+0

我很欣賞這個答案,並且我看到它是如何工作的,但是使用異常(或拒絕)來控制預期的程序流程似乎有問題。也不是特別可讀。感覺和我的解決方案一樣有問題。我想知道最好的解決方案是不是將這個承諾嵌套在一起。 –

+0

答案只演示了一種可能的方法。你也可以在'.then()'處檢查'null'的值,並在Question處使用現有的模式。您不需要使用'Promise.resolve(null)'作爲'.then()'返回一個新的'Promise';你可以單獨使用帶'null'的三元作爲返回鏈接'.then()'的值。投擲錯誤繞過'.then(onFulfilled)' – guest271314

相關問題