Angular处理不正确的缓存数据

时间:2015-06-12 14:06:07

标签: javascript angularjs angular-services

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

案例:

假设您已经构建了一个角度应用程序,人们登录系统会执行某些操作,然后可能会再次注销。应用程序将使用工厂和服务从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的控制器,则该用户将立即获取已获取的数据。

问题:

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

由于所有角度服务都是singletons,因此即使应该注销,服务也不会被破坏。

显而易见的答案

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

所以我的问题是你在上述情况下做了什么?你是否真的必须处理每次请求时加载数据或angular提供解决此问题的智能方法?

3 个答案:

答案 0 :(得分:3)

创建clear()函数

clear()工厂添加divisionService函数,该工厂负责清空缓存的数据结构(数组,对象......)

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();
}

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

答案 1 :(得分:1)

马克,

我的第一个想法就是跑步  divisionArray = [];

注销时。如果有效,请告诉我。如果没有,我会进一步调查。

答案 2 :(得分:1)

您也可以缓存用户信息并进行比较,以确定用户是否已更改,然后再决定刷新数据。