我有angular2项目,其中有这个类:
class Application {
id: number;
last_android_releasse_url: string;
last_android_releasse: Release;
last_ios_releasse_url: string;
last_ios_releasse: Release;
}
我获取所有应用程序并使用|加载它们异步管道这样:
this.asyncApps = this.appService.getAll(this.params)
.do((data: any) => {
this.count = data.count;
}).map(data => {
return data.apps;
});
我需要的是为data.apps中的每个应用程序加载每个发布对象,并为asyncApps返回observable以使用异步管道。我不知道如何提出我的问题所以我接受了改变标题的提议。 所以最终的代码应该是这样的:
this.asyncApps = this.appService.getAll(this.params)
.do((data: any) => {
this.count = data.count;
}).map(data => {
for (let app of data.apps) {
this.http.get(app.last_android_releasse_url).subscribe(
release_data => {
app.last_android_releasse = release_data.json().last_android_releasse;
},
error => this.alertService.showError(error.etext)
);
this.http.get(app.last_ios_releasse_url).subscribe(
release_data => {
app.last_ios_releasse = release_data.json().last_ios_releasse;
},
error => this.alertService.showError(error.etext)
);
}
return data.apps;
});
这个可行,但我正在考虑使用flatMap或forkJoin。对我来说似乎不是正确的解决方案。你能帮我清楚吗?
答案 0 :(得分:1)
你是对的,你可以使用flatMap。谢谢你的提问,这就是我的尝试。
this.asyncApps = this.appService.getAll(this.params)
.do((data: any) => {
this.count = data.count;
})
.flatMap(data => Observable.from(data.apps))
.flatMap(app => Observable.forkJoin(
this.http.get(app.last_android_releasse_url).map(d => d.json().last_android_releasse),
this.http.get(app.last_ios_releasse_url).map(d=>d.json().last_ios_releasse))
.first()
.map(res => Object.assign(app, {
last_android_releasse : res[0],
last_ios_releasse : res[1]})
)
);
让我知道它的工作原理。
这就是我做的事情
this.asyncApps = this.appService.getAll(this.params)
执行网络电话
.do((data: any) => {
this.count = data.count;
})
将计数更新为结果数
.flatMap(data => Observable.from(data.apps))
将列表流转换为单个项目流
.flatMap(app => Observable.forkJoin(
对于每个应用,我正在转换应用,而无需响应带响应数据的应用。由于它的异步并且需要Observable,所以使用了flatMap。
this.http.get(app.last_android_releasse_url).map(d => d.json().last_android_releasse),
this.http.get(app.last_ios_releasse_url).map(d=>d.json().last_ios_releasse))
并行执行单独调用并将结果合并到数组流
中 .first()
获得第一个结果
.map(res => Object.assign(app, {
last_android_releasse : res[0],
last_ios_releasse : res[1]})
)
将结果转换为带结果的应用
);
最后,我们应该有一个应用程序流,每个应用程序都有响应。