我有一個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承諾的。這對我來說似乎不同。
處理錯誤和處理錯誤消息或拒絕承諾的原因,我不認爲這件事確實是重複的是不是ES6承諾,請模式完全一樣。 – Bergi