两个控制器,同一工厂的两个调用,用于相同的http请求和同步冲突

时间:2015-07-31 13:44:30

标签: angularjs asynchronous controllers angular-services angular-http

我有一个mainCtrl,我在index.html的标签中注入:

<html ng-app="app" lang="fr" ng-controller="mainCtrl" xmlns:ng="http://angularjs.org">

因此,当我显示任何模板(页面)时,会调用index.html,因此也会调用mainCtrl。

对于每个被调用的视图,我在$ routeProvider中附加一个特定的控制器,如下所示:

.when("/factures",
{
    controller: "facturesCtrl",
    templateUrl: "assets/partials/factures.tpl.html",
    resolve: {
        checkPermission: function(Auth){
            return Auth.getUser();
        }
    }
})

在我的情况下,dataUsers函数调用一个带有几个参数的工厂,这些参数确定我将调用哪个URL(来自api),因此参数取决于函数。实施例。

mainCtrl:

$scope.dataUsers = function()
{
    $rootScope.PARAMS.a = 'all';

    User.get($rootScope.PARAMS, 'client', '').then(function(dataUsers)
    {
        //...

    }, function(reason){

        // ...
    }
}

user.fct.js

function getUserData($rootScope, $q, $http, $timeout, loadData)
{
    return {
        get: function(user, type, responseType)
        {
            var deferred = $q.defer();

            loadData.post('POST', $rootScope.directory + 'api/'+ type, user, responseType, function(data){

                if(data.status == 'ok')
                {
                    $timeout(function(){

                        deferred.resolve(data);
                    }, 250);
                }
            }); 

            return deferred.promise;                    
        }
    }
}

在某些情况下,我会使用不同的参数调用同一工厂。例如,账单控制器也会调用http.get工厂(上图)来显示最后一个客户账单。

facturesCtrl

$scope.dataFactures = function()
{
    $rootScope.PARAMS.a = 'last';

    User.get($rootScope.PARAMS, 'facture', '').then(function(dataFactures)
    {
        //...

    }, function(reason){

        //...
    }); 
}

$scope.dataFactures();

现在我的问题:

两个控制器: mainCtrl FacturesCtrl 在我的root / factures的同时被调用。

因此,同一个工厂被调用两次,但参数是假的。例如,Angular JS似乎使用以下顺序调用differentes方法:

1) dataUsers()                      -> rooscope.action = "all"
2) dataFactures()                   -> rooscope.action = "last"
3) get.getUserData(params, 'string')-> params = "all", 'string' = '/client'
3) get.getUserData(params, 'string')-> params = "last", 'string' = '/factures'

should be :

1) dataUsers()                      -> rooscope.action = "all"
2) get.getUserData(params, 'string')-> params = "all", 'string' = '/client'
2) dataFactures()                   -> rooscope.action = "last"
3) get.getUserData(params, 'string') -> params = "last", 'string' = '/factures'

因为,参数是混合的,通过这种方式API返回错误!

我试过了:

在启动回调承诺时调用dataUsers函数:

mainCtrl:

$scope.dataUsers = function()
{
    $rootScope.PARAMS.a = 'all';

    User.get($rootScope.PARAMS, 'client', '').then(function(dataUsers) //...

    //..
}

facturesCtrl:

   $scope.dataFactures = function()
    {
        $rootScope.PARAMS.a = 'last';

        User.get($rootScope.PARAMS, 'facture', '').then(function(dataFactures)
        {   
            // DATA USERS START
            $scope.dataUsers(); 

        }, function(reason){

            //...
        }); 
    }    
    $scope.dataFactures();

这个工作正常,但我不喜欢这种方法,因为:

  1. 我只能进行同步通话,而我更喜欢独立拆分 每次通话(asynchrone)。
  2. 使用这种方法,我可以部分地使用     控制我的电话。例如,我无法调用第一个dataUsers(),     等待promise回调并调用dataFactures()。
  3. 因为,必须通过我的方法调用dataUsers()来调用所有视图 必须通过视图声明一个控制器。我认为太糟糕了 为“使用条件”,“信息”,“热门”这样的页面声明一个控制器 新闻“或其他只显示文字的子视图..
  4. 我希望我足够清楚,换句话说我不知道​​配置应用程序的方式是否合适......

    提前感谢您的澄清:)

0 个答案:

没有答案