协调同步和异步操作
在某些情况下,你可能希望在 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;
}