2017-10-05 47 views
0

我在我的angularjs项目中有以下情况。我有两个函数名称Functn1()Functn2()。在这两个函数中都有一个到API服务器的http调用。我时间可持续调用这些函数为
Angularjs使函数调用Synchronus

$scope.Functn1(); 
$scope.Functn2(); 

,工作正常。但是,如果Token从第一个函数获取新的令牌之前是异步的,则第二个函数已经与旧的令牌一起消失。我想等第二个函数,直到第一个函数完成。在这种情况下,Functn1()Functn2()都位于相同的js文件中。
但是还有一种情况是两个函数都在不同的js文件中。这意味着在重新加载网页MasterController和当前页面控制器都在这里执行的情况下,一个函数在Mastercontroller中并且PageController中的一个函数在加载时执行。

+2

您可以使用'async/await'或者简单地使用'Functn1'中的回调函数,然后调用其他函数或使用promise类型。 – Panther

+0

你也可以使用'async.series'这个按顺序执行回调函数,我认为是你的问题 – Vignesh

回答

0

您可以使用$q喷油嘴实现角度。你只需要调用$ scope.Functn1当它获得成功的$ scope.Functn2()将启动

$scope.Functn1 = function() { 
    callyourservice.method(passParam).then(function(response){ 
     $scope.Functn2() 
    }) 
} 
+0

由于function1是从不同的空间调用来达到不同的目的,所以我不能在第一个函数成功时调用第二个函数(I意思是在某些情况下,我需要finction1和function2,但在某些情况下,我只想执行一项功能) – Salini

+0

您的其他情况是什么?解释场景。 –

0

使用异步回调可以做的工作适合你

async.series([function(cb1){ 
//call to first function 
cb1(null); 
},function(cb2){ 
//call to second function 
cb2(null) 
}],function(err,result){ 
//executed after all the callbacks are done 
done() 
}) 
0

最好的办法是建立在服务的功能(你可以用$ rootScope也)返回Promise

getToken(){ 
new Promise((resolve, reject) => { 
    resolve(yourToken); 
}) 
} 

然后在函数2

myService.getToken().then(token=>{ 
    //some code here 
}) 

此外,如果你在FUNCTION1也需要

myService.getToken().then(token=>{ 
    //some code here 
}) 
0
$scope.getToken = function() { 
    return $http(); 
}; 

$scope.getData = function (token) { 
    return $http(); 
}; 

$scope.useData = function (data) { 
    console.log(data); 
}; 

$scope.getToken 
    .then($scope.getData) 
    .then($scope.useData); 

这时,您的功能getData将接收到HTTP请求的响应,你的功能getToken。请记住要返回$http的承诺。

对于第二种情况,您可以在获取令牌并在PageController上捕获此事件后触发MasterController中的事件。捕获后,您可以发送第二个请求。

第一个控制器:

$scope.getToken 
    .then(function(token) { 
    $scope.$broadcast('myEvent', token); 
}); 

在第二控制器:

$scope.$on('myEvent', function(event, token) { 
    $scope.getData(token); 
}); 

甚至会更好使用服务来获取数据,并使用控制器只是屏幕的逻辑。