2014-12-01 116 views
0

我需要一个将返回布尔值的函数。第一次调用这个函数时,它应该从一个异步服务(返回一个promise)中加载这个值,然后对其进行缓存。随后对此函数的调用应该返回缓存的值。问题是这个函数的调用者应该被阻塞直到它获得一个值。在这种情况下最好的解决方案是什么?该函数是否应该以任何方式返回承诺(即是否缓存),并将需要阻塞的所有内容放入promise.then()中。如果这是一个很好的解决方案,那么在这两种情况下如何返回承诺(例如,何时缓存)?Angularjs承诺封锁解决方案


下面是一些代码,以更好地说明问题:

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 
    }); 
} 
+2

是的,它应该总是返回一个承诺,以保持一致性。但功能已经内置到角度,只需使用角度的缓存 – SoluableNonagon 2014-12-01 21:16:26

+3

http://stackoverflow.com/questions/14117653/how-to-cache-an-http-get-service-in-angularjs和https:// docs。 angularjs.org/api/ng/service/$http(搜索缓存) – SoluableNonagon 2014-12-01 21:18:11

+0

$ http.get(url,{cache:true})。success(...); – SoluableNonagon 2014-12-01 21:18:32

回答

0

是 - 它应该总是返回一个承诺,除非有另外的考虑阻止它这样做。这是为了保持一致性 - 如果方法可能是异步的,最好的做法是始终将它视为异步,以便稍后不会出现时髦的竞争条件。

既然你不能阻止,并且变通办法是hacky - 我认为它可能最适合你的问题,无论如何。只需将所有依赖代码放入then即可。