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

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

你也可以缓存用户信息,对比一下用户是否有变化再决定刷新数据。