如何等到嵌套的forkjoin完成?

时间:2016-11-14 09:50:36

标签: angular rxjs rxjs5

我遇到嵌套forkjoin的问题,当我尝试订阅pull时,它会恢复我的数据,但我可以看到getitem3仍在运行。如何在订阅之前等待所有功能完成

参见示例

pull(id) {
  return Observable.forkJoin(
    this.getitem1(id),
    this.getitem2(id),
    this.getitem3(id)
  );
}



getitem3(id) {
  let url = 'https://host3/get/' + id;
  let observableBatch = [];

  return this.http.get(url).map(res => res.json()).map(data => {
    data.posts.data.forEach((item) => {
      observableBatch.push(this.getImageUrl(item.id));
    })
    return Observable.forkJoin(observableBatch);
  })
}


getitem2(id) {
  let url = 'https://host2/get/' + id;
  let observableBatch = [];

  return this.http.get(url).map(res => res.json()).map(data => {
   data.posts.data.forEach((item) => {
     observableBatch.push(this.getImageUrl(item.id));
   });
   return Observable.forkJoin(observableBatch);

  });
}

 getitem1(id) {
  let url = 'https://host1/get/' + id;
  let observableBatch = [];

  return this.http.get(url).map(res => res.json()).map(data => {
    data.posts.data.forEach((item) => {
      observableBatch.push(this.getImageUrl(item.id));
    });
    return Observable.forkJoin(observableBatch);
  });
}

getImageUrl(id) {
  let url = 'https://localhost/image/' + id;
  return this.http.get(url).map(res => res.json()).map(data => {
    console.log('done');
  });
}

1 个答案:

答案 0 :(得分:3)

我认为您的方法getitemN()会返回Observable <Observable<any>>。如果您订阅了第一个可观察的,可以使用flatMap而不是map来呼叫其他人。

.flatMap(data => {
                data
                    .posts
                    .data
                    .forEach((item) => {
                        observableBatch.push(this.getImageUrl(item.id));
                    })
                return Observable.forkJoin(observableBatch);
            })

因此,在这种情况下,您只会获得Observable <any>

以下是有用的信息:http://www.syntaxsuccess.com/viewarticle/angular-2.0-and-http。 FlatMap位于“从属调用”部分。