0

Newbie to angular, using service I'm trying to load cachefactory and using the cache from controller.

Here is service methods

codesApp.service('CodeFilterService',function($filter, $http, CacheService,$log){
this.getByCodeType = function (codeTypeValue, codeName) {
    if (angular.isUndefined(CacheService.get('Codes'))) {
        loadCodes();
    }
    return  $filter('filter')(CacheService.get('Codes'), {codetype: codeTypeValue, name: '!' + codeName});
};

this.getAllCodes = function () {
    $log.info("getAllCodes");
    if (angular.isUndefined(CacheService.get('Codes'))) {
        $log.info("Loading fresh getAllCodes");
        this.loadCodes();
    }
    return  CacheService.get('Codes');
};

this.loadCodes = function () {
    $http.get("./rest/codes").then(function (response) {
        $log.info("Codes Size" +response.data.length );
        CacheService.put('Codes', response.data);
    });
    };
});

codesApp.factory('CacheService',function($cacheFactory){
     return $cacheFactory('super-cache');
 });

Controller Code :

codesApp.controller('CodeCreateController',function($scope,$state,
 Code,CodeFilterService,$log){

  ... 
$scope.codeDropdownList = CodeFilterService.getAllCodes();
   $log.info("codeDropdownList = " + angular.isUndefined($scope.codeDropdownList))    ;

}); 

Here angular.isUndefined($scope.codeDropdownList)) returns true which means data not getting loaded. Is there any way to resolve this issue.

2
  • 1
    Problem is retty simple... ajax is asynchronous so you can't call loadcodes() and immediately return to controller. Might want to use a resolve in router to load the cache before controller runs Commented Jan 22, 2016 at 15:15
  • @charlietfl thanks, can you provide a answer or psedocode Commented Jan 23, 2016 at 7:41

1 Answer 1

0

You may use promise inject $q

codesApp.service('CodeFilterService', function ($filter, $http, CacheService, $log, $q) {

    this.getByCodeType = function (codeTypeValue, codeName) {
        if (angular.isUndefined(CacheService.get('Codes'))) {
            loadCodes();
        }
        return $filter('filter')(CacheService.get('Codes'), {
            codetype: codeTypeValue,
            name: '!' + codeName
        });
    };

    this.getAllCodes = function () {
        $log.info("getAllCodes");
        var deferred = $q.defer();
        if (angular.isUndefined(CacheService.get('Codes'))) {
            $log.info("Loading fresh getAllCodes");
            this.loadCodes().then(function (result) {
                $log.error('getAllCodes success');
                var cachedCodes = CacheService.get('Codes');
                deferred.resolve(cachedCodes);
            }, function (reason) {
                $log.error('getAllCodes error: ' + reason);
                deferred.reject();
            });
        } else {
            var cachedCodes = CacheService.get('Codes');
            deferred.resolve(cachedCodes);
        }
        return deferred.promise;
    };

    this.loadCodes = function () {
        $log.info("loadCodes");
        var deferred = $q.defer();
        $http.get("./rest/codes").then(function (response) {
            $log.error('loadCodes success');
            $log.info("Codes Size" + response.data.length);
            CacheService.put('Codes', response.data);
            deferred.resolve();
        }, function (reason) {
            $log.error('loadCodes error: ' + reason);
            deferred.reject();
        });
        return deferred.promise;
    };
});




codesApp.controller('CodeCreateController', function ($scope, $state,
    Code, CodeFilterService, $log) {

    ...
    CodeFilterService.getAllCodes().then(function (result) {
        $log.info('result: ' + result);
        $scope.codeDropdownList = result;
        $log.info("codeDropdownList = " + angular.isUndefined($scope.codeDropdownList))
    }, function (reason) {
        $log.error('error: ' + reason);
    });

});
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.