Wie mache ich eine asynchrone HTTP-Anfrage in einer Angular2-Schleife / Map und ändere das ursprüngliche Schleifenarray?
Neu zu Angular2 hier und ich frage mich, wie diese asynchrone Anforderung für ein Array-Muster ausgeführt werden soll (ich weiß nicht so genau, wie das Muster heißt).
So sagen wir, ich benutze Angular2'sHttp
, um eine YouTube-Wiedergabeliste zu erhalten, die @ enthälvideoId
in jedem Retourenartikel. Dann muss ich diesen Punkt mit dem @ durchlaufvideoId
und fordere YouTube erneut auf, die einzelnen Videoinformationen abzurufen. Dies kann eine weitere häufig verwendete HTTP-Anforderung sein. Rufen Sie die Liste ab und durchlaufen Sie die Liste, um die Details zu jedem einzelnen Element abzurufen.
let url = [YouTube API V3 list url]
let detailUrl = 'https://www.googleapis.com/youtube/v3/videos?part=contentDetails,statistics';
this.http.get(url)
.map(res => res.json())
.subscribe(data => {
let newArray = data.items.map(entry => {
let videoUrl = detailUrl + '&id=' + entry.id.videoId +
'&key=' + this.googleToken;
this.http.get(videoUrl)
.map(videoRes => videoRes.json())
.subscribe(videoData => {
console.log(videoData);
//Here how to I join videoData into each item inside of data.items.
});
});
});
So funktioniert der obige Code. Aber ich habe noch zwei Fragen:
Wie kann ich dem @ beitretevideoData
zurück zudata.items
und stellen Sie sicher, dass das richtige Element imdata.items
wird mit dem richtigen @ verbundvideoData
(dasvideoData
das benutzt dasentry.id.videoId
des zugehörigen Artikels indata.items
) und erstelle das neuenewArray
?
Woher weiß ich, wann alles erledigt ist und mache etwas basierend auf allen Daten, nachdem alle asynchronen Anforderungen abgeschlossen sind?
Das newArray behält die gleiche Reihenfolge der ersten HTTP-Anforderung bei. Als erstes HTTP wurde die YouTube-Suchlisten-API mit der Reihenfolge von viewCount aufgerufen. Einfach Nest beobachtbar wie oben wird die ursprüngliche Reihenfolge nicht beibehalten.
AKTUALISIERE
Mit inoabrian Lösung kann ich die oben genannten drei Punkte erfolgreich erreichen. Aber wenn ich den myvideoservice erneut aufrufe (wie das Ändern der URL als neues NextPageToken), hat das Subject - this._videoObject 2 Beobachter. Und wieder laden, es hat 3 Beobachter und so weiter. Ich brauche eine Möglichkeit, das Thema auf nur 1 Beobachter zurückzusetzen, damit ich keine doppelten Videos habe. Ist dies eine bewährte Methode zum Löschen / Zurücksetzen des Betreffs?