【问题标题】:Angular promise service as global dataserviceAngular 承诺服务作为全球数据服务
【发布时间】:2013-12-19 15:33:57
【问题描述】:

我不是 Angular 的专业人士,我还在学习。希望我能在这里得到一些帮助。

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

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

我的服务:

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

【问题讨论】:

    标签: javascript http angularjs caching promise


    【解决方案1】:

    首先,正如 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 以及缓存来自服务器的数据。

    【讨论】:

      【解决方案2】:

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

      1. 浏览器检测
      2. 服务器请求(一旦您有更多请求,将进一步拆分。)
      3. 数据缓存

      【讨论】:

        猜你喜欢
        • 2015-08-12
        • 1970-01-01
        • 2017-03-01
        • 2018-01-16
        • 1970-01-01
        • 1970-01-01
        • 2017-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多