我需要一个返回布尔值的函数。第一次调用此函数时,它应该从异步服务(返回promise)加载值,然后缓存它。对此函数的后续调用应返回缓存的值。问题是应该阻止此函数的调用者,直到它获得值。在这种情况下,什么是最好的解决方案?该函数是否应该以任何方式返回一个promise(即是否缓存),并将所有需要阻塞的内容放在promise.then()中。如果这是一个很好的解决方案,我如何在任何一种情况下都返回一个承诺(例如,当它被缓存时)?
下面是一些代码可以更好地说明问题:
function isSomethingStored() {
if(getFromBrowserStorage() != null) {
var deferred = $q.defer();
deferred.resolve(true);
return deferred.promise;
}
var promise = ThirdParty.getSomethingThroughAjax();
promise.then(function(theSomething) {
addToBrowserStorage(theSomething);
return true;
});
return promise;
}
function caller() {
var promise = isSomethingStored();
promise.then(function(isReady) {
//we can continue
});
}
答案 0 :(得分:0)
是 - 应该总是返回一个承诺,除非有另一个考虑因素阻止它这样做。这是为了保持一致性 - 如果方法可能是异步的,最好将其视为异步,这样您以后就不会获得时髦的竞争条件。
因为无论如何你都无法阻止,而且变通方法很糟糕 - 我认为无论如何它可能最适合你的问题。只需将所有依赖代码放在then
。