1

我有一个 AngularJS 服务,它执行以下操作:

  1. 它尝试从 Lawnchair 读取用户数据(带有后备的 localStorage 抽象)。

  2. 如果用户数据不在 Lawnchair 中,该服务会调用 REST API 来检索它,并将值存储在 Lawnchair 中。

  3. 它返回用户数据。

由于 Lawnchair 操作和 REST 调用都是异步的,我认为这是对 Promises 的完美使用。

但是,我似乎无法收回价值。如果我调试,我可以看到从 REST 调用返回的值,并且还存储在 Lawnchair 中。如果我刷新,我可以看到 REST 调用从未进行过,并且 Lawnchair 返回它的版本。

任何提示表示赞赏!

这是我尝试从控制器中访问值的方式:

$scope.userdata = UserDataStore.Data()

这是相关服务的咖啡脚本:

.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
      }
  )
4

1 回答 1

0

我发现了几个必须修复的地方:

  1. 在返回对象的 Data 方法中,我试图返回 combinePromise.promise,考虑到 combinePromise 已经是内部 .promise 对象,这将不起作用,因此我不断返回 Undefined。

  2. 为了让值在我的控制器中使用,我必须在 promise 回调中这样做,如下所示:

    UserDataStore.Data().then((result) ->
         $scope.userdata = result
      )
    
于 2012-08-24T21:57:08.470 回答