我遇到嵌套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');
});
}
答案 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位于“从属调用”部分。