我有功能服务:
saveObject_1(formData): Observable<Model_1> {
return this.http.put('url_1', formData)
.map(this.extractData)
.catch(this.handleError);
}
saveObject_2(formData): Observable<Model_2> {
return this.http.put('url_2', formData)
.map(this.extractData)
.catch(this.handleError);
}
Model_1的fk为Model_2。在组件中,我可以这样做:
this.myService.saveObject_1(form_1Data).subscribe(
item => {
this.item = item;
this.myService.saveObject_2(form_2Data).subscribe(
item_2 => {
this.router.navigate(['/home']);
},
error => {
this.errorMessage = <any>error
}
);
},
error => {
this.errorMessage = <any>error
}
);
但我有很多这样的依赖,并不是所有都必须存在 - 我得到很多&#34;如果&#34;&#34; 。
如何在没有嵌套的情况下正确保存this.myService.saveObject_1后触发this.myService.saveObject_2?
答案 0 :(得分:1)
你可以使用flatMap
(或mergeMap
)来执行第二种方法,直到第一种方法准备好&#34;。
chainRequests(form_1Data, form_2Data) {
this.myService.saveObject_1(form_1Data)
.map(item => this.item = item)
.flatMap(item => this.myService.saveObject_2(form_2Data))
.subscribe(item2 => {
this.router.navigate(['/home']);
});
}
当第二个http请求依赖于第一个http请求的结果时,通常会使用 flatMap
,因此saveObject_2
方法上方依赖于item
能够执行请求,因此必须链接。虽然这不是这种情况,但我不知道为什么我们不能使用flatMap
链接一般的http请求:)正如所说here:
mergeMap运算符通过订阅并从内部Observable中提取值并将其传递回父流来帮助我们。这会使我们的代码压缩很多,并且无需嵌套订阅。
最后一个......