我在angularjs项目中有以下场景。我有两个函数名Functn1()
和Functn2()
。在这两个函数中都有一个对API服务器的http调用。我将这些功能称为
$scope.Functn1();
$scope.Functn2();
持续,这很好。但是,如果Token过期,因为在从第一个函数获取新令牌之前它是异步的,第二个函数已经用旧令牌消失了。我想等第二个功能,直到第一个功能完成。在这种情况下,Functn1()
和Functn2()
都在同一个js文件中。
但是还有一个场景,其中两个函数都在不同的js文件中。这意味着如果重新加载网页MasterController和当前页面控制器都在这里执行,一个函数在Mastercontroller中,一个在PageController中都在加载时执行。
答案 0 :(得分:0)
你可以使用角度为$q的注射器来实现它。你需要在成功时调用$ scope.Functn1 $ scope.Functn2()将启动
$scope.Functn1 = function() {
callyourservice.method(passParam).then(function(response){
$scope.Functn2()
})
}
答案 1 :(得分:0)
使用 async 回调可以为您完成工作
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()
})
答案 2 :(得分:0)
最好的方法是在服务中创建一个函数(你也可以使用$ rootScope)返回Promise之类的内容
getToken(){
new Promise((resolve, reject) => {
resolve(yourToken);
})
}
然后在function2
myService.getToken().then(token=>{
//some code here
})
如果你还需要在function1中
myService.getToken().then(token=>{
//some code here
})
答案 3 :(得分: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
将收到对您的函数getToken
的http请求的响应。请记住返回$http
承诺。
对于第二种情况,您可以在获取令牌并在PageController上捕获此事件后在MasterController中触发事件。捕获后,您可以发送第二个请求。
在第一个控制器上:
$scope.getToken
.then(function(token) {
$scope.$broadcast('myEvent', token);
});
在第二个控制器上:
$scope.$on('myEvent', function(event, token) {
$scope.getData(token);
});
使用服务获取数据并将控制器仅用于屏幕逻辑会更好。