Angular 处理不正确的缓存数据
Angular dealing with incorrect cached data
好的,这可能很长 post 但请不要点击离开,您可能知道一个简单的答案。
案例:
假设您构建了一个 angular 应用程序,人们可以在其中登录系统执行一些操作,然后可能会再次注销。该应用程序将使用工厂和服务从 API 收集数据,为了使 application
加载速度更快,您将这些数据保存在如下变量中:
app.factory("divisionService", function (api, $http, $q) {
var division = {};
var divisionArray = [];
var mergedUserList = [];
return {
getList: function () {
var d = $q.defer();
if (divisionArray <= 0) {
$http.get(api.getUrl('divisionWithUsers', null))
.success(function (response) {
divisionArray = response;
d.resolve(divisionArray);
});
}
if (divisionArray.length > 0) {
d.resolve(divisionArray);
}
return d.promise;
},
这将确保如果用户尝试使用使用 divisionService
的控制器,那么如果数据已经被获取,则该用户将立即获取数据。
问题:
现在用户注销,另一个用户登录(无需刷新/重新加载)页面。一旦控制器调用这个工厂,它就已经认为它有正确的列表,这意味着 return 将与以前的用户相同,但是这个数据可能不正确!
由于所有 angular 服务都是 singletons
服务不会在注销时被销毁,即使它应该被销毁。
显而易见的答案
这个问题的答案可能是:"Well then don't store the data in a variable" 并且由于这将起作用,大量数据可能会使页面内容加载缓慢。
所以我的问题是你在上述情况下会怎么做?您真的需要处理每次请求时加载数据,还是 angular
提供解决此问题的聪明方法?
马克,
我的第一个想法就是 运行
除法数组 = [];
注销时。如果可行,请告诉我。如果没有,我会进一步调查。
创建一个clear()
函数
向您的 divisionService
工厂添加一个 clear()
函数,它将负责清空缓存的数据结构(数组、对象...)
app.factory("divisionService", function () {
var division = {};
var divisionArray = [];
var mergedUserList = [];
return {
clear: function(){
// Clear the cached data
for (var key in division)
{
delete division[key];
}
divisionArray.length = 0;
// ...
},
getList: ...
}
});
并在您注销时从 调用此函数
function logout(){
divisionService.clear();
}
刷新应用程序
如果您不想处理清除缓存数据(例如调用 divisionService.clear()
),您也可以在注销时刷新整个应用程序
function logout(){
$window.location.reload();
}
这将导致整个应用程序重新加载,所有临时(基于变量的)缓存数据将被清除
你也可以缓存用户信息,对比一下用户是否有变化再决定刷新数据。
好的,这可能很长 post 但请不要点击离开,您可能知道一个简单的答案。
案例:
假设您构建了一个 angular 应用程序,人们可以在其中登录系统执行一些操作,然后可能会再次注销。该应用程序将使用工厂和服务从 API 收集数据,为了使 application
加载速度更快,您将这些数据保存在如下变量中:
app.factory("divisionService", function (api, $http, $q) {
var division = {};
var divisionArray = [];
var mergedUserList = [];
return {
getList: function () {
var d = $q.defer();
if (divisionArray <= 0) {
$http.get(api.getUrl('divisionWithUsers', null))
.success(function (response) {
divisionArray = response;
d.resolve(divisionArray);
});
}
if (divisionArray.length > 0) {
d.resolve(divisionArray);
}
return d.promise;
},
这将确保如果用户尝试使用使用 divisionService
的控制器,那么如果数据已经被获取,则该用户将立即获取数据。
问题:
现在用户注销,另一个用户登录(无需刷新/重新加载)页面。一旦控制器调用这个工厂,它就已经认为它有正确的列表,这意味着 return 将与以前的用户相同,但是这个数据可能不正确!
由于所有 angular 服务都是 singletons
服务不会在注销时被销毁,即使它应该被销毁。
显而易见的答案
这个问题的答案可能是:"Well then don't store the data in a variable" 并且由于这将起作用,大量数据可能会使页面内容加载缓慢。
所以我的问题是你在上述情况下会怎么做?您真的需要处理每次请求时加载数据,还是 angular
提供解决此问题的聪明方法?
马克,
我的第一个想法就是 运行 除法数组 = [];
注销时。如果可行,请告诉我。如果没有,我会进一步调查。
创建一个clear()
函数
向您的 divisionService
工厂添加一个 clear()
函数,它将负责清空缓存的数据结构(数组、对象...)
app.factory("divisionService", function () {
var division = {};
var divisionArray = [];
var mergedUserList = [];
return {
clear: function(){
// Clear the cached data
for (var key in division)
{
delete division[key];
}
divisionArray.length = 0;
// ...
},
getList: ...
}
});
并在您注销时从 调用此函数
function logout(){
divisionService.clear();
}
刷新应用程序
如果您不想处理清除缓存数据(例如调用 divisionService.clear()
),您也可以在注销时刷新整个应用程序
function logout(){
$window.location.reload();
}
这将导致整个应用程序重新加载,所有临时(基于变量的)缓存数据将被清除
你也可以缓存用户信息,对比一下用户是否有变化再决定刷新数据。