Вопрос

Я не профессионал в угловании и все еще лезвею. Надеюсь, я получу помощь здесь.

Я хочу построить приложение с разными представлениями. Мне нужно обнаружить браузер, а также получить некоторые данные с сервера. Для этого я создал услугу, где я выполняю эту работу.

Мое желание состоит в том, чтобы использовать данные Сервиса все взгляды. Как правильный способ сохранить и кэшировать данные, чтобы я мог использовать их во всех моих представлениях/контроллерах?
Вот что я получил до сих пор.

Мой сервис:

.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);
});
Это было полезно?

Решение

Прежде всего, как упоминал Нордике в его ответе, вам лучше разделить обслуживание на мелкие.

Во -вторых, вы спрашиваете, как кэшировать данные, и, поскольку вы используете обещание, $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) {
    ...
});

будет получать информацию о платформе только один раз в течение жизни наряда. Вы можете применить ту же идею к getServerData также, чтобы кэшировать данные с сервера.

Другие советы

Кэширование ваших данных в Service Singleton - хороший подход, и мне нравится ваша простая реализация. Моей единственной рекомендацией было бы разделить ваши 3 проблемы на отдельные услуги.

  1. Обнаружение браузера
  2. Запросы на сервера (которые будут разделены еще больше, когда у вас будет больше запросов.)
  3. Кэширование данных
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top