協調同步和非同步操作

在某些情況下,你可能希望在 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;
}