2017-07-25 4 views
0

Wie kann ich eine Funktion stoppen, während alle Async-Aufrufe durchgeführt wurden? Ich habe eine foreach auf einer Liste, die eine var Trog einen Asynchron-Aufruf erhöhen oder nicht (mit, wenn die Bedingung)AngularJs Async-Problem

Mein Code:

$scope.updateDureePeriodeList = function() { 

     var mttLoyer = 0 

     angular.forEach($scope.articleListDuree, function (value, key) { 
      if (value.selected) { 
       if (value.bOption) { 
        $scope.getTauxDevisRevOption(value.prixArt * value.qttArt).then(function (taux) { 
         mttLoyer += value.prixArt * value.qttArt * taux/100; 
        }) 
       } 
       else 
        mttLoyer += value.prixArt * value.qttArt * $scope.DureeEdit.taux/100; 
      } 

     }); 

     $scope.DureeEdit.periodeList = new Array(); 
     $scope.DureeEdit.periodeList.push({ 
      'numPeriode': 1, 
      'mttLoyer': parseFloat(mttLoyer).toFixed(2), 
     }); 
} 

Problem: getTauxDevisRevOption ist async und wenn ich daran gehen, mein Funktion nicht, dass es die $scope.DureeEdit.periodeList.push am Ende aufhören, so zu tun, bevor mttLoyer Zuwachs in der .then war() von dem Asynchron-Aufruf ...

+2

Suche nach asynchronen Operationen in Javascript – Hitmands

+0

Ich habe meine Suche getan und Antworten zu async mit Versprechungen (das, was ich tun, wenn ich getTauxDevisRevOption aufrufen), aber in diesem Fall bin ich in einer foreach, die mich blockiert und ich Antworten nicht gefunden, weil ich nicht den ganzen Code in der .then() tun kann, weil ich meine Schleife vor dem Anruf beenden muss, was ich am Ende der Funktion mache:/ – rob1

Antwort

1

was könnten Ihnen folgt helfen

function updateDureePeriodeList(data, defaultTaux, tauxLoader) { 

    return Promise 
    .all(
     Object 
     .keys(data) 
     .reduce((res, key) => { 
      const value = data[key]; 

      if(value.selected) { 
      const op = Promise 
       .resolve(value.bOption ? tauxLoader(value.prixArt * value.qttArt) : defaultTaux) 
       .then(taux => (value.prixArt * value.qttArt * taux/100)) 
      ; 

      res = res.concat(op); 
      } 

      return res; 
     }, []) 
    ) 
    .then(operations => operations.reduce((a, b) => a + b)) 
    ; 
} 

updateDureePeriodeList($scope.articleListDuree, $scope.DureeEdit.taux, (...args) => $scope.getTauxDevisRevOption(...args)) 
    .then(mttLoyer => console.log('mttLoyer', mttLoyer)) 
; 
+0

Danke Ich sehe, wie Sie damit umgehen wollen! Aber es gibt einen gleichen Weg, es in angularJs zu tun? – rob1

+0

dies ist angularjs – Hitmands

+0

Es ist Javascript, suchen Sie nach $ q.all und meine Lösung für eine eckigere approch, übrigens vielen Dank, Ihre Antwort hat mich auf die richtige Weise sowieso! – rob1

0

Nachdem ich einige Haare verloren habe, habe ich endlich die Lösung gefunden, nach der ich gefragt habe! Die Verwendung von $ q.all war der Schlüssel. Mein Arbeits Code:

$scope.updateDureePeriodeList = function() { 
     var mttLoyer = 0 
     var allQ = []; 

     angular.forEach($scope.articleListDuree, function (value, key) { 
      if (value.selected) { 
       if (value.bOption) { 
        allQ.push($scope.getTauxDevisRevOption(value.prixArt * value.qttArt).then(function (taux) { 
         mttLoyer += value.prixArt * value.qttArt * taux/100; 
        })); 
       } 
       else 
        mttLoyer += value.prixArt * value.qttArt * $scope.DureeEdit.taux/100; 
      } 

     }); 

     $q.all(allQ).then(function(data){ 
      $scope.DureeEdit.periodeList = new Array(); 
      $scope.DureeEdit.periodeList.push({ 
       'numPeriode': 1, 
       'nbrEch': nbrEch, 
       'mttLoyer': parseFloat(mttLoyer).toFixed(2), 
      }); 
     }); 
} 

In der Hoffnung, das jemand später helfen können!

+0

Haben Sie die Reihenfolge verstanden, was hier passiert? – Hitmands

+0

Mit Code läuft im Debbuging-Modus sehe ich klar die Reihenfolge ja so was hast du nicht verstanden, wenn ich helfen kann? – rob1

+0

Sie sollten sich die asynchrone Codeausführung genauer ansehen, während ein Summenergebnis nicht in der Reihenfolge ihrer Faktoren geändert wird. Sie führen Operationen in einer anderen Reihenfolge bezüglich Ihrer Eingabedaten aus ... – Hitmands