2014-12-01 106 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即可。