我有一个获取一些数据的wcf服务方法,我使用Microsoft Ajax库调用它。 为了共享这些数据,我创建了一个dataService,许多控制器都使用这个服务。
我希望每个控制器在第一次调用getData之后获取相同的数据,除非有人需要刷新数据并将forceRefresh设置为true。
我的代码失败了,因为初始化了应用程序3控制器调用dataService.getData并且对所有人都启动了一个新请求。如何在第一个调用完成之前等待dataService.getData调用,并为其他后续调用获得相同的结果。
angular.module('app', []).factory('dataService', function ($q) {
var data= [];
var getData= function (forceRefresh) {
console.log('getFolders called: ', reports.length);
var deferred = $q.defer();
if (forceRefresh || data.length < 1) {
WcfService.GetData(function(result) {
data= result;
deferred.resolve(data);
}, function(ex) { console.log(ex); });
} else {
deferred.resolve(reports);
}
return deferred.promise;
};
return {
getData: getData
};
});
答案 0 :(得分:1)
一种方法是缓存promise而不是数据,因此它在创建时会被缓存,而不是在数据到达时缓存。毕竟,这听起来像你的用例。
angular.module('app', []).factory('dataService', function ($q) {
var deferred = null;
var getData= function (forceRefresh) {
console.log('getFolders called: ', reports.length);
if(!forceRefresh && deferred) return deferred.promise;
deferred = $q.defer();
WcfService.GetData(
function(result) { deferred.resolve(data); }, // I'd promisify at a
function(ex){ deferred.reject(ex); } // higher level probably
);
return deferred.promise;
};
return {
getData: getData
};
});
答案 1 :(得分:0)
当控制器查询数据时,如何在$ rootscope中设置全局标志,这可以在所有控制器获取数据之前进行检查,从而避免冗余调用。当任何一个控制器履行了承诺并获取了数据时,可以放下相同的标志,然后可以在所有控制器之间共享。
答案 2 :(得分:-1)
我找到了我搜索的内容
AngularJS服务的承诺队列 http://inspectorit.com/tips-tricks/promise-queue-for-angularjs-services/