Arhn - архитектура программирования

угловой контроллер выполняется до завершения фабрики

Я переместил некоторый общий код в factory. но контроллер выполняется до загрузки фабрики. В этом случае я получаю пустой ответ (ноль результатов)

может кто подскажет лучшее решение.

вот моя угловая фабрика,

app.factory('TabsFactory', function($resource){
    var activetabs = {};            
    activetabs.getDepositAccountDetails = function() {
        return $resource('xxxx/:number', {}, {
            getDepositAccountDetailsService: {
                method: 'GET',
                isArray: false
            }
        });
    }
    activetabs.getAccountInfo = function(){
        return accountinit.accountInfo;
    }
    activetabs.setAccountInfo = function(accountnumber, result) {
         var accountinit = {
                accountInfo: []
            }
        if (result.code == "v") {           
            activetabs.getDepositAccountDetails().getDepositAccountDetailsService({
                number: accountnumber
            }).$promise.then(function(response) {
               accountinit.accountInfo = response; 
              //here i am getting the JSON response
            }, function(error) {

            });
        }
        return accountinit;
    }
    return activetabs;
  });

контроллер,

TabsFactory.setAccountInfo(accountnumber, $scope.accountInfo);    
$scope.accountInfo = TabsFactory.getAccountInfo();
alert(JSON.stringify($scope.accountInfo));

  • используйте обещание .. Это решит вашу проблему. 15.04.2015
  • это асинхронная природа веб-сервисов - совершенно нормально для angularjs 15.04.2015

Ответы:


1

Вы должны использовать обещание цепочки для обновления переменной области, потому что ваша переменная accountInfo обновляется внутри обещания $resource.

Код

TabsFactory.setAccountInfo(accountnumber, $scope.accountInfo).then(function(data){
  $scope.accountInfo = TabsFactory.getAccountInfo();
  alert(JSON.stringify($scope.accountInfo));
});

Обновить

Метод службы должен возвращать обещание, чтобы продолжить цепочку обещаний.

activetabs.setAccountInfo = function(accountnumber, result) {
     var accountinit = {
            accountInfo: []
        }
    if (result.code == "v") {
        //added return below      
        return activetabs.getDepositAccountDetails().getDepositAccountDetailsService({
            number: accountnumber
        }).$promise.then(function(response) {
           accountinit.accountInfo = response; 
           return accountinit.accountInfo;
          //here i am getting the JSON response
        }, function(error) {

        });
    }
    return accountinit;
}
15.04.2015
  • но я получаю сообщение об ошибке, Ошибка: TabsFactory.setAccountInfo(...).then undefined 15.04.2015
  • @vishnu do Рад помочь вам, спасибо 15.04.2015

  • 2

    Да, это произойдет из-за того, что JavaScript выполняет асинхронные операции, но ваш контроллер таким образом, что он ожидает, что все будет синхронным.

    Когда вы вызываете TabsFactory.getAccountInfo(), возможно, ваш $resource('xxxx/:number') еще не завершен и ответ готов для обработки!!

    Так что делать? Вы использовали обещание. Обычно у меня есть репозиторий (фабрика с методом, который возвращает обещание) для обработки связи с сервером. Вот пример:

    app.factory('accountRepository', ["$http","$q",function($http,$q){
    
       return {
            getDepositAccountDetails : function(id) {
               var deferred = $q.defer();
               $http.ger('xxx').success(deferred.resolve).error(deferred.reject);
               return deferred.promise;
            }
       };
    }] );
    

    В моем репозитории будет больше операций, таких как добавление учетной записи, обновление информации об учетной записи и т. д.

    мой контроллер/служба затем вызывает эти методы следующим образом:

    accountRepository.getDepositAccountDetails(123).then(function(response) {
               // Process the response..
     }, function(error) {
               // Some error occured! handle it
     });
    

    при этом мой код выполняется только после того, как я получу ответ от сервера и данные будут готовы к использованию или отображению. Надеюсь это поможет..

    Обновление: вы можете взглянуть на этот чтобы понять ;)

    15.04.2015
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..