2017-10-05 75 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); 
}); 

甚至會更好使用服務來獲取數據,並使用控制器只是屏幕的邏輯。