Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2014
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. stateManager
  2.  
  3. (function() {
  4.     'use strict';
  5.  
  6.     /**
  7.      * Service manager statement loading
  8.      */
  9.  
  10.     var stateManager = function($rootScope, $timeout, advancedLog) {
  11.         advancedLog = advancedLog.getInstance('stateManager');
  12.  
  13.         var stateManager   = {
  14.                 'init' : {},
  15.                 'error': {},
  16.                 'load' : {}
  17.             },
  18.             loadContainers = { /* Контейнер с сервисами */
  19.                 init: {}
  20.             };
  21.  
  22.         $rootScope.loader = {
  23.             init: {
  24.                 active: true,
  25.                 current: {}
  26.             }
  27.         };
  28.  
  29.         stateManager.init.add = function(service) {
  30.             var addService = function(object, name) {
  31.                     loadContainers.init[name] = object;
  32.                     advancedLog.info('Добавлен сервис: %s', {func: 'add'}, name);
  33.                 },
  34.  
  35.                 check = function(data) {
  36.                     if (!_.isEmpty(data) && angular.isObject(data)) {
  37.                         if (_.has(service[index], 'async')) {
  38.                             return (!data.async) ? _.has(data, 'order') : true;
  39.                         }
  40.                     }
  41.                 };
  42.  
  43.             if (angular.isObject(service)) {
  44.                 for (var index in service) {
  45.                     if (check(service[index])) {
  46.  
  47.                         if (_.isEmpty($rootScope.loader.init.current)) {
  48.                             this.setCurrent().force(service[index], index);
  49.                         }
  50.  
  51.                         addService(service[index], index);
  52.                     } else {
  53.                         advancedLog.info('Отсуствует указание типа очередности событий или один из ключей не является объектом - %s', {func: 'add'}, index);
  54.                     }
  55.                 }
  56.             } else {
  57.                 advancedLog.info('Добавленный список сервисов не является объектом %s', {func: 'add'}, service);
  58.             }
  59.         };
  60.  
  61.         stateManager.init.remove =  function(name) {
  62.             var service = this.getByName(name);
  63.  
  64.             if (service) {
  65.                 var container = loadContainers.init;
  66.  
  67.                 delete container[name];
  68.  
  69.                 if (!service.async) {
  70.                     if (!_.isEmpty($rootScope.loader.init.current) && $rootScope.loader.init.current.name == name) {
  71.                         this.setCurrent().next();
  72.                     }
  73.                 }
  74.  
  75.  
  76.                 advancedLog.info('Удален сервис: %s. Осталось: %d, список: %s', {func: 'remove'}, name, _.size(container), JSON.stringify(Object.keys(container)));
  77.  
  78.                 if (_.isEmpty(container)) {
  79.                     this.clear();
  80.                     advancedLog.info('Менеджер состояний пустой', {func: 'add'});
  81.                 }
  82.             } else {
  83.                 advancedLog.info('Сервис не найден', {func: 'add'});
  84.             }
  85.         };
  86.  
  87.         stateManager.init.setCurrent =  function() {
  88.  
  89.             var setCurrent = {};
  90.  
  91.             function set(service, name) {
  92.                 $rootScope.loader.init.current = service;
  93.                 $rootScope.loader.init.current.name = (service.name) ? service.name : name;
  94.             }
  95.  
  96.             setCurrent.force = function(service, name) {
  97.                 if (!_.isEmpty(service) && !_.isEmpty(name)) {
  98.                     if (!_.isEmpty($rootScope.loader.init.current)) {
  99.                         set(service, name);
  100.                     } else {
  101.                         if (service.order === 1) {
  102.                             set(service, name);
  103.                         }
  104.                     }
  105.                 }
  106.             };
  107.  
  108.             setCurrent.next = function() {
  109.                 if (!_.isEmpty(loadContainers.init)) {
  110.                     for (var index in loadContainers.init) {
  111.                         if (!loadContainers.init[index].async && loadContainers.init[index].order == $rootScope.loader.init.current.order + 1) {
  112.                             set(loadContainers.init[index], index);
  113.  
  114.                             break;
  115.                         }
  116.                     }
  117.                 }
  118.             };
  119.  
  120.             return setCurrent;
  121.         };
  122.  
  123.         stateManager.init.getByName =  function(name) {
  124.             var service = loadContainers.init;
  125.  
  126.             advancedLog.info((service) ? 'Сервис %s найден' : 'Сервис %s не найден', {func: 'getByName'}, name);
  127.             return service;
  128.         };
  129.  
  130.         stateManager.init.clear =  function() {
  131.             loadContainers.init = {};
  132.  
  133.             $timeout(function() {
  134.                 $rootScope.loader.init = {
  135.                     active: false,
  136.                     current: null
  137.                 };
  138.  
  139.                 advancedLog.info('Менеджер состояний инициализации очищен', {func: 'clear'});
  140.             }, 300);
  141.         };
  142.  
  143.         return stateManager;
  144.     };
  145.  
  146.     stateManager.$inject = ['$rootScope', '$timeout', 'advancedLog'];
  147.  
  148.     angular.module('appServices').factory('stateManager',  stateManager);
  149. })();
  150.  
  151.  
  152. initService
  153.  
  154. (function() {
  155.     'use strict';
  156.  
  157.     /**
  158.      * INITIALIZATION service
  159.      */
  160.  
  161.     function init($q, $injector, advancedLog) {
  162.         advancedLog = advancedLog.getInstance('init');
  163.  
  164.         var init     = {},
  165.             services = {},        /* Контейнер с внедряемыми сервисами */
  166.             initData = {
  167.                 'status': 'wait-start',
  168.                 'defer' : $q.defer(),
  169.  
  170.                 'services': {
  171.                     'vkInit': {
  172.                         async: false,
  173.                         order: 1
  174.                     },
  175.                     'socketInit': {
  176.                         async: false,
  177.                         order: 2
  178.                     },
  179.                     'loadDataInit': {
  180.                         async: false,
  181.                         order: 3
  182.                     }
  183.                 }
  184.             },
  185.             injected = {
  186.                 'finish'  : false,
  187.                 'services': ['vk', 'socket', 'stateManager', 'getData']
  188.             };
  189.  
  190.         init.start = function start() {
  191.             injectService().then(function() {
  192.  
  193.                 if (init.check('wait-start')) {
  194.                     advancedLog.info('Запущена инициализация приложения', {func: 'start'});
  195.                     services.stateManager.init.add(initData.services);
  196.                     initData.status = 'start';
  197.  
  198.                     services.vk.init().then(function() {
  199.                             services.stateManager.init.remove('vkInit');
  200.  
  201.                             services.socket.manager.connect().then(function(socketOBJ) {
  202.                                 services.stateManager.init.remove('socketInit');
  203.  
  204.                                 services.getData.user.init(services.socket).then(function() {
  205.                                     services.socket.manager.executeCB();
  206.  
  207.                                     services.stateManager.init.remove('loadDataInit');
  208.  
  209.                                     initData.status = 'finish';
  210.                                     initData.defer.resolve();
  211.  
  212.                                     advancedLog.info('Инициализация завершена', {func: 'start'});
  213.                                 });
  214.                             });
  215.                         }
  216.                     );
  217.                 } else {
  218.                     advancedLog.info('Инициализация уже происходит или завершена', {func: 'start'});
  219.                 }
  220.             });
  221.  
  222.             return initData.defer;
  223.         };
  224.  
  225.         init.after = function after() {
  226.             var defer = $q.defer();
  227.  
  228.             initData.defer.promise.then(function() {
  229.                 defer.resolve();
  230.             });
  231.  
  232.             return defer.promise;
  233.         };
  234.  
  235.         init.check = function check(status) {
  236.             return initData.status === status;
  237.         };
  238.  
  239.  
  240.  
  241.         function injectService() {
  242.             var defer = $q.defer();
  243.  
  244.             if (!injected.finish) {
  245.                 for (var index in injected.services) {
  246.                     if ($injector.has(injected.services[index])) {
  247.                         services[injected.services[index]] = $injector.get(injected.services[index]);
  248.  
  249.                         if (_.last(injected.services) === injected.services[index]) {
  250.                             injected.finish = true;
  251.                             defer.resolve();
  252.                         }
  253.                     } else {
  254.                         defer.reject();
  255.                         advancedLog.error('Сервис %s не найден!', {func: 'injectService'}, injected.services[index]);
  256.                     }
  257.                 }
  258.             } else {
  259.                 advancedLog.info('Внедрение сервисов уже произведено!', {func: 'injectService'});
  260.  
  261.                 defer.resolve();
  262.             }
  263.  
  264.             return defer.promise;
  265.         }
  266.  
  267.         return init;
  268.     }
  269.  
  270.     init.$inject = ['$q', '$injector', 'advancedLog'];
  271.     angular.module('appServices').factory('init', init);
  272.  
  273. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement