2016-05-03 7 views
0

Ich versuche, mit der Youtube-API zu arbeiten. Um die Icons für die ersten n-ten Videos zu bekommen, muss ich eine Anfrage stellen. Ich dachte daran, eine for-Schleife zu machen und innerhalb dieser Schleife würde es die Anfrage geben.HTTP-Anfragen innerhalb einer for-Schleife machen ANGULAR JS 2

Das Problem mit diesem Ansatz ist, dass ich die Antworten mit der falschen Reihenfolge und völlig zufällig bekomme.

Also meine Frage :

ist es eine Möglichkeit, eine for-Schleife, um auf eine Antwort warten? Ich bin auch in der Lage mit den RxJS Betreiber zu arbeiten, aber ich weiß nicht, was ich für

Vielen Dank im Voraus

Antwort

2

Sie konnten die Observable.forJoin Methode nutzen, suchen soll. In diesem Fall wird der "globale" Callback aufgerufen, wenn alle Requests beendet sind.

Hier ist ein Beispiel ist:

Observable.forkJoin([ 
    this.http.get('/req1').map(res => res.json()), 
    this.http.get('/req2').map(res => res.json()), 
    (...) 
]).subscribe(results => { 
    // Called when all requests have ended 
    var result1 = results[0]; 
    var result2 = results[1]; 
    (...) 
}); 

In Ihrem speziellen Anwendungsfall können Sie die flatMap Betreiber zusätzlich nutzen:

this.http.get('/videos').map(res => res.json()) 
    .flatMap(videos => { 
    return Observable.forkJoin(videos.map((video) => { 
     return this.http.get(`/video/${video.id}/icon`) 
         .map(res => res.json()); 
    }); 
    }).subscribe(results => { 
    // all icons received here 
    }); 
0

So landete ich so etwas wie dies zu verbrauchen.

searchVideo(videoIdArray) { 
    let observableBatch = []; 
    let data; 
    let i; 
    let videosTempArray: Array<Video>=[]; 
    for(i=0;i<videoIdArray.length;i++){ 
     let videoTemp: Video= {}; 
     videosTempArray.push(videoTemp); 
    } 
    videosTempArray.forEach((videoTemp, key) => { 
      observableBatch.push(this.http.get(BASE_URL_VIDEO + '?part=statistics%2Csnippet' + '&id=' + videoIdArray[key].videoId + '&key=' + API_TOKEN) 
        .map((res: Response) => { 
               res.json(); 
               // console.log(key); 
               data = res.json(); 
               videosTempArray[key].channelId=data.items[0].snippet.channelId; 
               videosTempArray[key].tags=data.items[0].snippet.tags; 
               videosTempArray[key].views=data.items[0].statistics.viewCount; 
               videosTempArray[key].likes=data.items[0].statistics.likeCount; 
               videosTempArray[key].dislikes=data.items[0].statistics.dislikeCount; 
               return videosTempArray[key]; 
              } 
         ) 
     ); 
    }); 
    return Observable.forkJoin(observableBatch); 
} 

Dank für die Hilfe !!!

Verwandte Themen