Search code examples
javascriptangularjsscopeangularjs-serviceydn-db

Return local variable in one function to another


I'm building an offline HTML page using Angular and using ydn-db for offline storage.

I have a database service like so,

demoApp.SericeFactory.database  = function database() {
    var database = {
        dataStore: null,
        admins: [],
        students: [],
        errors: [],
        getadmindata: function(username) {
           self = null, that = this 
           database.dataStore.get('admins', username).done(function(record) {
                that.self = record;
                return record;
           }).fail(function(e) {
                console.log(e);
                database.errors.push(e);
           });
           return self; //This does not change.
        }
     };

   database.dataStore = new ydn.db.Storage('DemoApp');

   angular.forEach(INITSTUDENTS, function(student) {
       database.dataStore.put('students', student, student.matricno);
    database.students.push(student);
   });

   angular.forEach(INITADMINS, function(admin) {
   database.dataStore.put('admins', admin, admin.username);
    database.admins.push(admin);
   });

   return database;

I also have a controller that attempts to use the database;

function AppCntl ($scope, database) {
     var user = database.getadmindata('user'); //I get nothing here.
}

What I have tried, I have tried making changing self to var self I have tried splitting the function like so

rq = database.dataStore.get('admins', 'user');
rq.done(function(record), {
   self = record;
   alert(self.name) //Works.
});
   alert(self) //Doesn't work.

I have gone through questions like this o StackOverflow but nothings seems to be working for me or maybe I have just been looking in the wrong place.


Solution

  • Database request are asynchronous and hence it executes later after end of execution of the codes.

    So when the last alert execute, self is still undefined. Secound alert execute after db request completion and it is usual right design pattern.

    EDIT:

    I have success with following code:

    // Database service
    angular.module('myApp.services', [])
      .factory('database', function() {
        return new ydn.db.Storage('feature-matrix', schema);
      }
    });
    
    // controller using database service
    angular.module('myApp.controllers', [])
     .controller('HomeCtrl', ['$scope', 'utils', 'database', function($scope, utils, db) {
      var index_name = 'platform, browser';
      var key_range = null;
      var limit = 200;
      var offset = 0;
      var reverse = false;
      var unique = true;
      db.keys('ydn-db-meta', index_name, key_range, limit, offset, reverse, unique)
          .then(function(keys) {
            var req = db.values('ydn-db', keys);
            req.then(function(json) {
              $scope.results = utils.processResult(json);
              $scope.$apply();
            }, function(e) {
              throw e;
            }, this);
          });
    }])
    

    Complete app is available at https://github.com/yathit/feature-matrix

    Running demo app is here: http://dev.yathit.com/demo/feature-matrix/index.html