協調同步和非同步操作
在某些情況下,你可能希望在 promise 中包含同步操作以防止在程式碼分支中重複。舉個例子:
if (result) { // if we already have a result
processResult(result); // process it
} else {
fetchResult().then(processResult);
}
通過在 promise 中冗餘地包裝同步操作,可以協調上述程式碼的同步和非同步分支:
var fetch = result
? Promise.resolve(result)
: fetchResult();
fetch.then(processResult);
快取非同步呼叫的結果時,最好快取 promise 而不是結果本身。這確保了僅需要一個非同步操作來解析多個並行請求。
遇到錯誤情況時,應注意使快取值無效。
// A resource that is not expected to change frequently
var planets = 'http://swapi.co/api/planets/';
// The cached promise, or null
var cachedPromise;
function fetchResult() {
if (!cachedPromise) {
cachedPromise = fetch(planets)
.catch(function (e) {
// Invalidate the current result to retry on the next fetch
cachedPromise = null;
// re-raise the error to propagate it to callers
throw e;
});
}
return cachedPromise;
}