Angularjs 在全局服务中存储服务器数据。我如何确保它在那里
我的应用程序中有一个globalDataService,可以从服务器读取几个实体 我只想读取数据一次,然后通过服务上的方法提供数据。这是一个简化的版本Angularjs 在全局服务中存储服务器数据。我如何确保它在那里,angularjs,angularjs-service,Angularjs,Angularjs Service,我的应用程序中有一个globalDataService,可以从服务器读取几个实体 我只想读取数据一次,然后通过服务上的方法提供数据。这是一个简化的版本 angular.module("myApp").factory("globalData", ["siteResource", globalData]); function globalData( siteResource) { var sites = []; siteResource.query().$promise.then(
angular.module("myApp").factory("globalData", ["siteResource", globalData]);
function globalData( siteResource) {
var sites = [];
siteResource.query().$promise.then(function(data){
sites = data;
},
function(response) {
//handle bad stuff
});
var getSites = function () { return sites; }
return { getSites: getSites };
}
在我的控制器里,我只想做到这一点
this.sites = globalData.getSites();
要知道数据在那里,如果没有,那就是出了问题。我需要在我的服务中做些什么才能做到这一点,我只是浪费了2个小时试图用$q做一些事情,但没有任何乐趣
当我需要数据时,globalData服务是否加载了数据,尤其是当应用程序第一次加载时,这是运气好的…保存承诺并返回承诺。创建承诺一次并重复使用
angular.module("myApp").factory("globalData", ["siteResource", globalData]);
function globalData(siteResource) {
var promise;
function getSitesPromise () {
if (!promise) {
promise = siteResource.query().$promise;
promise = promise.catch( function (error) {
//handle bad stuff
});
};
return promise;
};
return { getSitesPromise: getSitesPromise };
}
你所做的很简单。 Prob向服务器发出$http请求以获取数据。但你不想每次都在init上创建它们 你可以像这样使用$q
var promise1 = $http.get('/mypath1');
var promise2 = $http.get('/mypath2');
var promises = $q.all([promise1, promise2]); // resolves when all promises are resolved OR will reject when ONE promise rejects
promises.then(function(arrayContainingAllServerResponses) {
// do something
}).catch(function(error) {
// oops one of the requests failed
})
很抱歉,我没有时间说更多的细节-这可能会让你走上正确的轨道-干杯
这是因为$http返回一个承诺:)
记住,如果你有一个承诺,那么你可以调用它-然后代码将在承诺得到解决时执行(而不是立即执行)。你甚至可以通过回复THEN的承诺来约束THENs。希望这一切都有帮助
如果一个方法返回一个承诺,那么您可以调用它的返回值。记住$http返回一个承诺,当服务器响应或请求超时时,该承诺将被解析或拒绝 请看:。您希望从工厂返回
promise
,工厂将解析为缓存的结果,并在不存在时获取该结果。你可以自己解决承诺
。太好了,谢谢你,我缺少的环节是让服务返回承诺。。。