Pregunta

No soy profesional en angular y todavía estoy listando. Espero recibir ayuda aquí.

Quiero crear una aplicación con diferentes vistas. Necesito detectar el navegador y también obtener algunos datos de un servidor. Para esto creé un servicio, donde hago este trabajo.

Mi deseo es usar los datos del servicio todas las vistas. ¿Cómo es la forma adecuada de almacenar y almacenar en caché los datos para que pueda usarlos en todas mis vistas/controladores?
Esto es lo que obtuve hasta ahora.

Mi servicio:

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

Mi controlador:

DataService.getPlatform().getPlatformData().then(function(platform) {
    console.log('Another browserDetect request');
    $scope.platform = platform;
    DataService.addItem("platform", $scope.userPlatform);
});
¿Fue útil?

Solución

En primer lugar, como Nordyke mencionó en su respuesta, es mejor que divida el servicio a los más pequeños.

En segundo lugar, estás pidiendo cómo almacenar en caché los datos y, dado que estás usando Promise, $q.when() es lo que necesitas. Tomaré el getPlatform Como ejemplo para comenzar:

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

De esta manera, la información del sistema operativo se almacena en caché y

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

solo obtendrá la información de la plataforma una vez durante la vida útil del servicio de datos. Puede aplicar la misma idea a getServerData también para almacenar en caché los datos del servidor.

Otros consejos

Al almacenar en caché sus datos en un servicio Singleton es un buen enfoque, y me gusta su implementación directa de ellos. Mi única recomendación sería dividir sus 3 preocupaciones en servicios separados.

  1. Detección del navegador
  2. Solicitudes del servidor (que se dividirán aún más una vez que tenga más solicitudes).
  3. Almacenamiento en caché de datos
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top