2017-10-05 2 views
0

Ich habe das folgende Szenario in meinem angularjs Projekt. Ich habe zwei zwei Funktionen Namen Functn1() und Functn2(). In beiden Funktionen gibt es einen HTTP-Aufruf an den API-Server. Ich rufe diese Funktionen als
Angularjs machen Funktionsaufruf Synchronus

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

continuosly, das funktioniert gut. Aber im Falle von Token ablaufen, da es asynchronus ist, bevor das neue Token von der ersten Funktion erhalten, ist die zweite Funktion bereits mit dem alten Token gegangen. Ich möchte die zweite Funktion warten, bis die erste abgeschlossen ist. In diesem Fall befinden sich sowohl Functn1() als auch Functn2() in derselben js-Datei.
Aber es gibt auch ein weiteres Szenario, in dem beide Funktionen in verschiedenen js-Datei sind. Das bedeutet, dass beim erneuten Laden der Webseite MasterController und des aktuellen Seitencontrollers beide eine Funktion im Mastercontroller und eine im PageController ausgeführt werden.

+2

können Sie 'async/await' verwenden oder einfach einen Callback von' Functn1' verwenden und dann die andere Funktion aufrufen oder einen Versprechensstil verwenden. – Panther

+0

Sie können auch 'async.series' verwenden, das führt die Callbacks in einer Reihenfolgen aus, von denen ich annehme, dass es Ihr Problem ist. – Vignesh

Antwort

0

können Sie es mit $q Injektor in Winkel erreichen. Sie müssen nur scope.Functn1 $ rufen, wenn es erfolgreich $ scope.Functn2() erhalten

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

Da die Funktion1 aus anderem Raum für verschiedene Zwecke aufgerufen wird, kann ich die zweite Funktion nicht auf Erfolg des ersten aufrufen In einigen Fällen brauche ich sowohl finction1 als auch function2, aber in einem anderen Fall möchte ich nur eine Funktion ausführen. – Salini

+0

Was ist Ihr anderer Fall? .. Erklären Sie das Szenario. –

0

Mit async Rückrufe einleiten wird die Arbeit für Sie tun

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

Der beste Weg wäre, eine Funktion in einem Dienst erstellen zurückzukehren (kann $ rootScope auch verwenden) Promise so etwas wie

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

dann in function2

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

auch, wenn Sie in function1 müssen auch

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); 

das tun, Ihre Funktion getData wird die Antwort auf die HTTP-Anforderung empfangen von Ihnen getToken funktionieren. Denken Sie daran, das Versprechen $http zurückzugeben.

Für den zweiten Fall können Sie ein Ereignis im MasterController auslösen, nachdem Sie das Token erhalten und dieses Ereignis auf dem PageController erfasst haben. Nach dem Erfassen können Sie die zweite Anfrage senden.

Auf dem ersten Controller:

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

Auf dem zweiten Controller:

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

wäre noch besser einen Dienst zu verwenden, um die Daten zu holen und die Steuerung nur für die Bildschirmlogik verwenden.