在这种情况下,标准方法是缓存较低级别的 Promise。
通常,您会在某个合适的外部范围内建立一个 js 普通对象作为 Promise 缓存,并始终在调用异步进程之前先查看那里。
var promiseCache = {};
function foo() {
if(!promiseCache.foo) {
promiseCache.foo = doSomethingAsync();
}
return promiseCache.foo;
}
function bar() {
return foo().then(doSomethingElseAsync);
}
当然,如果合适的话,没有什么可以阻止你缓存更高级别的 Promise。
function bar() {
if(!promiseCache.bar) {
promiseCache.bar = foo().then(doSomethingElseAsync);
}
return promiseCache.bar;
}
编辑:forceRefresh 功能
您可以通过传递(额外)参数来强制函数刷新其缓存的承诺。
function foo(any, number, of, other, arguments, forceRefresh) {
if(forceRefresh || !promiseCache.foo) {
promiseCache.foo = doSomethingAsync();
}
return promiseCache.foo;
}
通过将forceRefresh 作为最后一个参数,将其省略与传递false 和foo 将使用缓存的promise(如果可用)。或者,传递true 以保证调用doSomethingAsync() 并刷新缓存值。
编辑 2:setName()/getName()
在getName() 中使用forceRefresh 机制:
setName(newName).then(getName.bind(null, true)); //set new name then read it back using forceRefresh.
或者,省略forceRefresh 机制,并假设缓存属性为promiseCache.name:
setName(newName).then(function() {
promiseCache.name = $.when(newName);//update the cache with a simulated `getName()` promise.
});
第一种方法更优雅,第二种更高效。