2012-08-24 152 views
1

服務我有一個AngularJS服務,其執行以下操作:AngularJS與承諾

  1. 它試圖從Lawnchair(localStorage的抽象與回退)讀取用戶數據。

  2. 如果用戶數據不在Lawnchair中,則該服務會調用REST API來檢索它,並將該值存儲在Lawnchair中。

  3. 它返回用戶數據。

由於Lawnchair操作和REST調用都是異步的,我認爲這將是對Promises的完美使用。

但是,我似乎無法取回價值。如果我調試,我可以看到從REST調用返回的值,並存儲在Lawnchair中。如果我刷新,我可以看到REST呼叫從來沒有做過,Lawnchair返回它的版本。

任何提示,感激!

這裏是我想從我的控制器內訪問該值:

$scope.userdata = UserDataStore.Data() 

下面是相關服務的CoffeeScript:

.factory('UserData', ($resource,$location) -> 
    return $resource('http://' + $location.host() + '/Services/userinfo') 
) 
.factory('UserDataStore', ($resource, $location, UserData, $q) -> 
    GetUserDataFromXhr =() -> 
     xhrDeferred = $q.defer() 
     UserData.get((userdata) -> 
     xhrDeferred.resolve userdata.userInfo 
     ) 
     return xhrDeferred.promise 
    GetUserDataFromStore =() -> 
     storeDeferred = $q.defer() 
     Lawnchair()-> 
     @get 'userdata',(result) -> 
      storeDeferred.resolve result 
     return storeDeferred.promise 
    return { 
     Clear:() -> 
     Lawnchair()-> 
      @remove('userdata') 
     Data:() -> 
     sPromise = GetUserDataFromStore() 
     combinedPromise = sPromise.then((result) -> 
      if not result 
      xPromise = GetUserDataFromXhr() 
      xPromise.then((result) -> 
       resultString = JSON.stringify(result) 
       userdata = {key:"userdata", value:resultString} 
       Lawnchair() -> 
       @save userdata 
      ) 
      return xPromise 
      else 
      return result 
     ) 
     return combinedPromise.promise 
     } 
) 

回答

0

我發現一對夫婦的地方,我有修復東西:

  1. 在返回對象的Data方法中,我試圖返回combinedPromise.promise,如果考慮combinedPromise已經是內部的.promise對象,那麼這是行不通的,因此Undefined我一直在回頭。

  2. 爲了得到在我的控制器一起工作的價值,我曾在承諾回調這樣可以這樣做:

    UserDataStore.Data().then((result) -> 
        $scope.userdata = result 
    )