Angularjs使函数调用Synchronus

时间:2017-10-05 05:11:37

标签: javascript angularjs asynchronous

我在angularjs项目中有以下场景。我有两个函数名Functn1()Functn2()。在这两个函数中都有一个对API服务器的http调用。我将这些功能称为

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

持续,这很好。但是,如果Token过期,因为在从第一个函数获取新令牌之前它是异步的,第二个函数已经用旧令牌消失了。我想等第二个功能,直到第一个功能完成。在这种情况下,Functn1()Functn2()都在同一个js文件中。
但是还有一个场景,其中两个函数都在不同的js文件中。这意味着如果重新加载网页MasterController和当前页面控制器都在这里执行,一个函数在Mastercontroller中,一个在PageController中都在加载时执行。

4 个答案:

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

使用服务获取数据并将控制器仅用于屏幕逻辑会更好。