Angular5 RXJS递归http请求

时间:2017-12-26 13:24:09

标签: rxjs angular5 fork-join

我目前有这种情况:

#Service My Service
private users = ['user1','user2'];

//Generate list of requests to join
private getHttpList(): any[] {
  let gets = new Array();
  for(let index in this.users)
      gets.push(this.http.get('https://api.github.com/users/' + this.users[index]))
  return gets;
}
...
getList(): Observable<any[]> {
    return forkJoin(this.getHttpList())
}

在我的组件中,我进行订阅

this.MyService.getList().subscribe(results => {
    for(let res in results) {
       //...Do something here
       //..I wanna do the get in of https://api.github.com/users/{user}/starred
    }
})

假设我只知道&#34;已加星标的网址&#34;在getList()的结果之后,我怎么能&#34;同步&#34;这个部分,或者正确的形式是什么?

**我尝试硬编码 - 结果错误,因为&#34; res&#34;是一个可以互动的&#34;

this.MyService.getList().subscribe(results => {
        let url = 'https://api.github.com/users/';
        for(let res in results) {//This don't do the things "synchronous"
           this.http.get(url + res.login +'/starred').catch(err => {
               throw new Error(err.message);
           }).subscribe(starred_res => {
               //So we set the starred_list
               res.starred_list = starred_res 
           })
        }
    })

...谢谢

1 个答案:

答案 0 :(得分:0)

据我了解,您希望获得每个用户的已加星标列表。

最简单的方法是获取所有已加星标的列表,并将匹配与用户结果匹配。

// Get users
this.MyService.getList().subscribe((results: any[]) => {

  const url = 'https://api.github.com/users/';

  // Create requests to get starred list for every user
  const starredRequests = results.map(
    res => this.http.get('https://api.github.com/users/' + res.login + '/starred')
  );

  // Wait when all starred requests done and map them with results array
  Observable.forkJoin(starredRequests).subscribe(starred => {

    results.forEach((res, index) => {
      res.starred_list = starred[index];
    });

    console.log(results);
  });

});