调用超过 1 个 $rootScope.$on

Call more than 1 $rootScope.$on

嘿,我试图仅在有 2 个 $broadcast 事件时才执行一部分代码,这就是我得到的结果。

在我的 controller1 中有这个。

$rootScope.$broadcast('receivedData');

在我的控制器2

$rootScope.$broadcast('dataLoaded');

到目前为止我有这个。

$rootScope.$on('dataLoaded',function(){
    $http({
       url:"http://api/data",
       method:"POST",
       data:{id_cliente: parseInt(getVariable("id"))},
       headers:{
             "Content-Type":"application/json;charset=utf-8",
             "Authorization" : "Bearer " + getVariable("token")
     }
   })
     .then(function(response){
           setVariable("contratos", JSON.stringify(response.data));
           $rootScope.$broadcast("cargaContratos");

   },
     function(response){
     });
})

而且只有在触发 recievedDatadataLoaded 时我才必须执行此操作。有人知道怎么做吗?

也许你可以这样做:

var received = [];

$rootScope.$on('receivedData', function() {
    received.push('receivedData');
    doSomething();
})
$rootScope.$on('dataLoaded', function() {
    received.push('dataLoaded');
    doSomething();
})

doSomething() {
    if (received.indexOf('receivedData') > -1 && received.indexOf('dataLoaded') > -1) {
        // Your code here
    }
}

不过我建议使用 services/promises,AngularJS 默认包含一个 promise 库:$q。然后,您可以简单地使用 $q.all()。但就目前而言,这应该可以正常工作。


更新(承诺示例)

实际上,您已经使用了 promise ($http),它启用了 then() 的回调。

这是一个简单的 promise 设置示例(可复制粘贴)。你应该试试看:

服务:

app.service('promiseTest', function($q) {
    this.myPromise = function() {
        return $q(function(resolve, reject) {
            setTimeout(function() {
                resolve('hello!');
            }, 1000);
        });
    }
})

Component/Controller:

app.controller('promiseTestCtrl', function(promiseTest) {
    promiseTest.myPromise().then(function(msg) {
        console.log(msg)
    })
})

我建议和他们一起玩,以便更好地理解他们。

当两个调用都转换为 promise 时,您可以使用:

var promises = [myService.receivedData, myService.dataLoaded];

$q.all(promises).then(function() {
    // Your code
})