문제

나는 각도가 아니며 여전히 끔찍합니다. 여기서 도움을 받기를 바랍니다.

다른 조회수가있는 앱을 만들고 싶습니다. 브라우저를 감지하고 서버에서 일부 데이터를 가져와야합니다. 이를 위해 나는이 일을하는 서비스를 만들었습니다.

나의 소망은 서비스의 데이터를 모든 견해를 사용하는 것입니다. 내 모든 뷰/컨트롤러에서 데이터를 사용할 수 있도록 데이터를 저장하고 캐시하는 방법은 무엇입니까?
여기 내가 지금까지 얻은 것입니다.

내 서비스 :

.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가 그의 대답에서 언급했듯이, 당신은 서비스를 작은 것들로 나누는 것이 좋습니다.

둘째, 데이터 캐싱 방법을 묻고 약속을 사용하기 때문에 $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) {
    ...
});

데이터 서비스의 수명 동안 플랫폼 정보를 한 번만 가져옵니다. 동일한 아이디어를 적용 할 수 있습니다 getServerData 서버에서 데이터를 캐시합니다.

다른 팁

서비스 싱글 톤에서 데이터를 캐싱하는 것은 좋은 접근 방식이며, 나는 당신의 간단한 구현을 좋아합니다. 저의 유일한 추천은 3 가지 문제를 별도의 서비스로 나누는 것입니다.

  1. 브라우저 감지
  2. 서버 요청 (더 많은 요청이 있으면 더 나빠질 것입니다.)
  3. 데이터 캐싱
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top