Angular承诺服务作为全球数据服务

时间:2013-12-03 14:13:55

标签: javascript http angularjs caching promise

我不是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);
});

2 个答案:

答案 0 :(得分:3)

首先,正如nordyke在他的回答中所提到的,你最好将服务拆分为较小的服务。

其次,您正在询问如何缓存数据,因为您正在使用承诺,$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
            };
        }
    };
});

通过这种方式,可以缓存OS信息,

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

只会在DataService的生命周期内获取一次平台信息。您也可以将相同的想法应用于getServerData以缓存来自服务器的数据。

答案 1 :(得分:1)

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

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