Javascript 处理不正确的缓存数据

Javascript 处理不正确的缓存数据,javascript,angularjs,angular-services,Javascript,Angularjs,Angular Services,好的,这可能是一篇很长的帖子,但请不要点击,你可能知道一个简单的答案 案例: 假设您已经构建了一个angular应用程序,在该应用程序中,用户登录系统进行一些操作,然后可能再次注销。应用程序将使用工厂和服务从API收集数据,为了使应用程序加载更快,您可以将这些数据保存在如下变量中: app.factory("divisionService", function (api, $http, $q) { var division = {}; var divisionArray = []; var me

好的,这可能是一篇很长的帖子,但请不要点击,你可能知道一个简单的答案

案例:

假设您已经构建了一个angular应用程序,在该应用程序中,用户登录系统进行一些操作,然后可能再次注销。应用程序将使用工厂和服务从API收集数据,为了使
应用程序
加载更快,您可以将这些数据保存在如下变量中:

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;
    },
app.factory(“分区服务”,函数(api,$http,$q){
var除法={};
变量数组=[];
var mergedUserList=[];
返回{
getList:函数(){
var d=$q.defer();
if(数组0){
d、 解析(数组);
}
回报承诺;
},
这将确保如果用户尝试使用使用
分区服务的控制器
,则该用户将立即获取已获取的数据

问题:

现在,用户注销,另一个用户登录(不刷新/重新加载)页面。一旦控制器调用此工厂,它就会认为它具有正确的列表,这意味着返回值将与前一个用户相同,但此数据可能不正确

由于所有angular服务都是
单例服务
,因此即使服务应该退出,也不会在注销时被降级

显而易见的答案

这个问题的答案可能是:“那么就不要将数据存储在变量中”,因为这将起作用,大量的数据可能会使页面内容加载缓慢

因此,我的问题是,在上述情况下,您会怎么做?您真的必须在每次请求时加载数据,还是
angular
提供了解决此问题的智能方法?

Marc

我的第一个想法是跑步 分区数组=[]

注销时。让我知道这是否有效。如果无效,我将进一步研究。

创建一个
clear()
函数 将
clear()
函数添加到
divisionService
工厂,该工厂将负责清空缓存的数据结构(数组、对象等)

并在您注销时从调用此函数

function logout(){
    divisionService.clear();
}
刷新应用程序 如果您不想清除缓存数据(例如调用
divisionService.clear()
),也可以在注销时刷新整个应用程序


这将导致重新加载整个应用程序,以及所有临时的(基于变量的)缓存的数据将被清除

您也可以缓存用户信息,并在决定刷新数据之前对其进行比较,以查看用户是否已更改。

用户信息(如用户名)是否存储在您获得的数据中?@aw04否。本例中存储的数据是属于个人用户的建筑物列表,如何处理你知道它们属于那个单独的用户吗?@aw04我的api接受一个令牌这个令牌包含我的DBM将用来搜索正确数据的用户id。我不知道这在你的情况下是否有效,但我的第一个想法是缓存该用户id或令牌,并在决定是否刷新数据之前对其进行比较,看看是否发生了更改is可以解决这个问题,但是我必须为我使用的每一项服务都这样做,而且它似乎是多余的?这是一个很好的方法,比我认为的答案更简洁
function logout(){
    divisionService.clear();
}
function logout(){
    $window.location.reload();
}