2016-11-02 1 views
0

Ich habe $ q.all für das Ausführen einer Reihe von Versprechen asynchron verwendet. In einem der Elemente des Arrays möchte ich das Versprechen kaskadieren, so dass ich die ganzen Funktionen beenden möchte, bevor ich zur letzten Funktion übergehe. Der Code sieht unter:

$q.all([ 
     function1().then(function() { }, function (reason) { addToErrorList($scope, reason) }), 
     function2().then(function() { }, function (reason) { addToErrorList($scope, reason) }), 
     function3().then(function() { }, function (reason) { addToErrorList($scope, reason) }), 
     function4().then(function() { }, function (reason) { addToErrorList($scope, reason) }), 
     function5($q).then(
      function() { 
       $q.all([ 
        function51($q).then(function() { }, function (reason) { addToErrorList($scope, reason) }), 
        function52($q).then(function() { 
         someLogic(); 
        }, function (reason) { addToErrorList($scope, reason); }), 
       ])}) 
    ]).then(function() { 
     usSpinnerService.stop('spinner'); 

     if ($scope.errorList.length > 0) { 
      showMessages($scope, $scope.errorList, "error"); 
     } 
    }); 

Es scheint, wie der Code ging auszuführen "usSpinnerService.stop ('Spinner');" bevor es tatsächlich in function51 und function52 läuft. Ich frage mich, ob es da überhaupt noch darum geht, draußen alle Funktionen auszuführen? Vielen Dank.

Und ich fand auch, dass addToErrorList ($ Umfang, Grund) in jedem der ersten vier Funktionen asynchron ausgeführt werden. Gibt es trotzdem, um es synchron laufen zu lassen, führen Sie dann die Ooutest-Funktion aus?

Korrektur: obiger Absatz ist nicht korrekt. Ich habe überprüft, dass addToErrorList DOES ausgeführt wird, bevor die äußere Funktion angeklickt wird.

+0

'return' hier ist dein Freund. Gib das Ergebnis deines inneren '$ q.all' zurück. –

+0

Rückruf Hölle scheint möglich zu sein, auch mit dem Versprechen :) – smnbbrv

+0

_Ist es trotzdem, um es dann synchron dann führen Sie den outest zu machen laufen function_ - die äußere 'then' Rückruf wird, bevor nicht ausgeführt werden' addToErrorList' –

Antwort

2

Sie müssen $q.all hier um:

function() { 
    return $q.all([ 
     function51($q).then(function() { }, function (reason) { addToErrorList($scope, reason) }), 
     function52($q).then(function() { 
      someLogic($http, $scope, $q, sharedService); 
     }, function (reason) { addToErrorList($scope, reason); }), 
    ])}) 
+0

Thank you! Ihr Vorschlag funktioniert definitiv für mich, nachdem ich viele andere Probleme ausgeschlossen habe. –

+0

Gern geschehen) –

Verwandte Themen