在for循环ANGULAR JS 2中发出http请求

时间:2016-05-03 09:42:55

标签: xmlhttprequest angular ionic2

我正在尝试使用youtube API。 为了获得前n个视频的图标,我必须提出请求。 我正在考虑制作一个for循环,在那个循环中会有请求。

这种方法的问题在于我得到错误顺序的响应并且完全随机。

所以我的问题

有没有办法让for循环等待响应?我也能够与RxJS运营商合作,但我不知道应该搜索什么

提前致谢

2 个答案:

答案 0 :(得分:2)

您可以使用Observable.forJoin方法。在这种情况下,"全球"当所有请求都已结束时,将调用回调。

以下是一个示例:

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];
  (...)
});

在您的特定用例中,您还可以利用flatMap运算符:

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
   });

答案 1 :(得分:0)

所以我最终使用了这样的东西。

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);
}

感谢您的帮助!!!