我有一个AngularJS服务,它执行以下操作:
它试图从Lawnchair读取用户数据(带有后备的localStorage抽象)。
如果用户数据不在Lawnchair中,则服务会调用REST API来检索它,并将值存储在Lawnchair中。
返回用户数据。
由于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 :(得分:0)
我找到了几个我必须修理的地方:
在返回对象的Data方法中,我试图返回combinedPromise.promise,考虑到combinedPromise已经是内部.promise对象,这是行不通的,因此Undefined我一直在回来。
为了在我的控制器中获取值,我必须在promise回调中这样做:
UserDataStore.Data().then((result) ->
$scope.userdata = result
)