角度控制器在工厂完成之前执行

时间:2015-04-15 05:25:59

标签: javascript angularjs promise angular-promise angular-resource

我已将一些常用代码移至工厂。但是在工厂加载之前控制器正在执行。在这种情况下,我得到空白响应(零结果)

任何人都可以提出最佳解决方案。

这是我的角度工厂,

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));

2 个答案:

答案 0 :(得分:1)

您应该使用链承诺更新范围变量,因为accountInfo变量在$resource承诺内更新。

<强>代码

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

<强>更新

服务方法应该返回promise以继续保证链

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;
}

答案 1 :(得分:0)

是的,这会发生,因为JavaScript执行异步操作,但是你的控制器需要进行同步操作。

当您致电TabsFactory.getAccountInfo()时,您的$resource('xxxx/:number')可能仍未完成且响应已准备好供您处理!!

那么,该怎么办?您已使用promise。我通常有一个存储库(一个带有返回promise的方法的工厂)来处理服务器通信。这是一个例子:

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
 });

这样做,我的代码只有在我从服务器获得响应并且数据准备好消费或显示之后才会执行。希望这会有所帮助..

更新:您可能需要查看this才能明白这一点;)