2016-05-04 8 views
3

Ich kann nicht scheinen, den Code zu haben, um anzuhalten und auf die $ HTTP Antwort zu warten, bevor ich weitergehe. Derzeit ist mein Code sieht etwa so aus:

var postAuthorCache = new Array(); 
angular.forEach($scope.news.posts, function(value, key) { 
    console.log(JSON.stringify(postAuthorCache)); //Keeps printing "[]" 
    if (!(value["post_author"] in postAuthorCache)) { 
     $http.get('/api/tumblr_primaryblog_name/' + value["post_author"]).then(function(response) { 
      postAuthorCache[value["post_author"]] = response.data; 
      value["post_author_pblog"] = postAuthorCache[value["post_author"]]; 
      console.log("NOT CACHE: " + value["post_author"]); 
     }); 
    } else { 
     value["post_author_pblog"] = postAuthorCache[value["post_author"]]; 
     console.log("IN CACHE: " + value["post_author"]); 
    }; 
}); 

Aber wenn es lief, der console.log Ausgang ist nicht das, was ich erwartet hatte.

[] 
[] 
[] 
[] 
[] 
[] 
[] 
NOT CACHE: aaaa 
NOT CACHE: bbbb 
NOT CACHE: aaaa 
NOT CACHE: aaaa 
NOT CACHE: aaaa 
NOT CACHE: aaaa 
NOT CACHE: bbbb 

Die Ausgabe, die ich erwartet hatte, um die console.log(JSON.stringify(postAuthorCache)); mit am Anfang laufen, dann nach $ http abfragt, läuft es entweder console.log("NOT CACHE: " + value["post_author"]); oder console.log("IN CACHE: " + value["post_author"]);. Danach sollte es sich wiederholen, indem das stringify für das Array-Objekt erneut angezeigt wird und mit den Protokollanweisungen NOT CACHE oder IN CACHE fortgefahren wird.

Also die Frage ist, wie würde die Foreach-Schleife warten auf $ http.get zu vervollständigen, bevor Sie weiter?

+0

Mehrere Möglichkeiten, um dies zu erreichen, aber besser zu verstehen, wie Sie die Werte tatsächlich verwenden werden, da 'console.log' Nachrichtenreihenfolge ist wahrscheinlich nicht, wie Sie es verwenden möchten? Wenn dies der Fall ist, könnten Sie das Array manuell durchlaufen, anstatt "forEach" zu verwenden und nur eine laufende Zählung des aktuellen "Index" zu behalten? Und gehen Sie nur weiter, indem Sie 'index' im '.get' Callback zählen. – Akurn

+0

Mögliches Duplikat von [Gibt es eine Möglichkeit, Promise in angular.foreach zu implementieren?] (Http://stackoverflow.com/questions/36997004/is-there-a -möglich-Weise-Implementierung-Versprechen-in-Winkel-foreach) – Maverick

Antwort

0

Versuchen Sie diesen Code -

var deferred = $q.defer(); 
    $http.post('/api/tumblr_primaryblog_name/' + value["post_author"]).then(
     function successCallback(response){ 
      deferred.resolve(response); 
      return deferred.promise; 
     }, 
     function errorCallback(response){ 
      deferred.reject(response); 
      return deferred.promise; 
     }); 
+0

@ downvoter: warum? – naveen

+0

Ich habe nicht downvote, aber das beantwortet eigentlich keinen Teil der Frage. Es ist auch überflüssig, da '$ http.post' bereits ein Versprechen zurückgibt. – Miral

0

Eine Möglichkeit zur Implementierung ist Rekursion zu warten, für jeden Anruf zu beenden. Überprüfen Sie here.

anderer Weg ist, Versprechen verwenden Verkettungs here

+1

Dies sollte ein Kommentar sein, keine Antwort. – naveen

1

Sie müssen die Tatsache cachen, dass Sie im Begriff sind, eine Abfrage zu tun, zum Beispiel:

var postRequestCache = {}; 
var postResponseCache = {}; 
angular.forEach($scope.news.posts, function(value, key) { 
    var author = value["post_author"]; 
    if (!(author in postRequestCache)) { 
     postRequestCache[author] = $http.get('/api/tumblr_primaryblog_name/' + author).then(function(response) { 
      postResponseCache[author] = response.data; 
     }); 
    } 
}); 
$q.all(postRequestCache).then(function() { 
    angular.forEach($scope.news.posts, function (value, key) { 
     var response = postResponseCache[value["post_author"]]; 
     value["post_author_pblog"] = response.response.blog.title; 
    }); 
}); 

Sie wollen wahrscheinlich etwas mehr hinzufügen Fehlerüberprüfung obwohl. Beachten Sie auch, dass es möglich ist, die Antworten direkt im letzten Handler zu erhalten, ohne über postResponseCache zu gehen, aber das ist einfacher.

Verwandte Themen