协调同步和异步操作

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