AngularJS服务与承诺

时间:2012-08-24 18:58:04

标签: coffeescript angularjs promise

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

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

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

  3. 返回用户数据。

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

1 个答案:

答案 0 :(得分:0)

我找到了几个我必须修理的地方:

  1. 在返回对象的Data方法中,我试图返回combinedPromise.promise,考虑到combinedPromise已经是内部.promise对象,这是行不通的,因此Undefined我一直在回来。

  2. 为了在我的控制器中获取值,我必须在promise回调中这样做:

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