2016-04-04 5 views
0

Ich habe ein Problem beim Ausführen von asynchronen Anrufe mit AngularJS (ich benutze Ionic). Ich habe Daten in $localStorage gespeichert. Dann gibt es eine Funktion, die alle Daten an den Server sendet. Die Sache besteht darin, sie im Falle eines Fehlerrückrufs von der HTTP-POST-Anforderung zurückzulegen. Es ist mein Code:Handle mehrere Post und Daten abrufen mit angularJs

var data = $localStorage.prelevement.environement; 
for (var j = 0; j < data.length; j++) { 
    $http.post("http://localhost:3000/prelevement/environement", data[j]).then(
    function (res){}, 
    function (err) { 
     $localStorage.prelevements.environement.push(data[j]); 
    }); 
    } 

Der Punkt ist, dass, wenn der erste Rückruf geschieht, wird die for-Schleife bereits fertig und j = data.length + 1 so bekam ich einen Fehler, da data[j]undefined ist.

Gibt es eine Möglichkeit, gesendete Daten in meiner Callback-Funktion zu fangen oder irgendeine Idee, damit umzugehen?

+0

haben Sie versucht, ein $ timeout/setTimeout für jeden Anruf zu setzen? – MrNew

+0

Meiner Meinung nach verschieben Sie den '$ http'-Teil in eine Funktion, die den Wert als Parameter akzeptiert und in der Schleife verwendet. Der Grund für die Verwendung von Funktionen ist hier, den Vorteil der Schließung zu nutzen. – Ali

Antwort

0

Wrap Sie $localStorage.prelevement.environement; in einem Versprechen, und führen Sie den Rest Ihres Codes. Denken Sie daran, in Ihrem Konstruktor auf $q zu verweisen.

var dataPromise = $q.when($localStorage.prelevement.environement); // returns a promise 

dataPromise.then(function(){ // resolve the promise in the successcallback using then() 
    for (var j = 0; j < data.length; j++) { 
     $http.post("http://localhost:3000/prelevement/environement", data[j]).then(
     function (res){}, 
     function (err) { 
      $localStorage.prelevements.environement.push(data[j]); 
     }); 
     } 
}); 
0

Ich habe die Antwort gefunden, ich habe es in einer anonymen Funktion eingewickelt:

var data = $localStorage.prelevement.environement; 
for (var j = 0; j < data.length; j++) { 
    (function(i){ 
     $http.post("http://localhost:3000/prelevement/environement", data[j]).then(
      function (res){}, 
      function (err) { 
       $localStorage.prelevements.environement.push(data[j]); 
     }); 
    })(j) 
    } 

Vielen Dank für Ihre Antworten! :)