我不在角度,仍在倾斜。希望我在这里得到一些帮助。

我想构建一个具有不同视图的应用程序。我需要检测浏览器并从服务器中获取一些数据。为此,我创建了一项服务,我在其中完成了这项工作。

我的愿望是使用所有视图的服务数据。如何存储和缓存数据的正确方法,以便可以在所有视图/控制器中使用它?
这是我到目前为止得到的。

我的服务:

.factory('DataService', function($http, $q, $timeout) {
var data = { };
return {
    notes: function() {
        // This exposed private data
        return data;
    },
    addItem: function(itemname, itemvalue) {
        // This is a public function that modifies private data
        data[itemname] = itemvalue;
    }
    getPlatform: function() {
        var getPlatformData = function() {
          var deferred = $q.defer();
          BrowserDetect.init();
          deferred.resolve(BrowserDetect.OS);
            return deferred.promise;
        };
        return {
            getPlatformData: getPlatformData
        };
    },
    getServerData: function() {
        //if(!data.getServerData){
        var getData = function() {
            var deferred = $q.defer();
            $http({
                url: 'js/fakeGet.json',
                method: 'get',
                dataType: 'json',
            }).success(function(data) {
                data.scanResponse = data;
                deferred.resolve(data);
            })
            return deferred.promise;
        };

        return {
            getData: getData
        };
        //}
        // return data.scanResponse;
    }
};
});

我的控制器:

DataService.getPlatform().getPlatformData().then(function(platform) {
    console.log('Another browserDetect request');
    $scope.platform = platform;
    DataService.addItem("platform", $scope.userPlatform);
});
有帮助吗?

解决方案

首先,正如Nordyke在答案中提到的那样,您最好将服务分配给较小的服务。

其次,您正在询问如何缓存数据,并且由于您使用了Promise, $q.when() 是您需要的。我会接受 getPlatform 作为让您开始的一个例子:

.factory('DataService', function($http, $q, $timeout) {
    var os; // this variable is used to store the result

    return {
        getPlatform: function() {
            var getPlatformData = function() {
                if (!os) { // no previous data available, look into other service to fetch the data
                    var deferred = $q.defer();
                    BrowserDetect.init();
                    os = BrowserDetect.OS; // store data
                    deferred.resolve(os);
                    return deferred.promise;
                }
                return $q.when(os); // there is previous data, return it as promise
            };
            return {
                getPlatformData: getPlatformData
            };
        }
    };
});

通过这种方式,操作系统的信息被缓存,并且

DataService.getPlatform().getPlatformData().then(function(platform) {
    ...
});

在DataService的终生期间,只会获取一次平台信息。您可以将相同的想法应用于 getServerData 以及从服务器中缓存数据。

其他提示

在服务中,将数据缓存是一种很好的方法,我喜欢您直接实现它。我唯一的建议是将您的3个问题分为单独的服务。

  1. 浏览器检测
  2. 服务器请求(一旦您有更多的请求,它将更加拆分。)
  3. 数据缓存
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top