其他完成时如何触发服务功能?

时间:2017-03-13 10:16:54

标签: angular

我有功能服务:

    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?

1 个答案:

答案 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中提取值并将其传递回父流来帮助我们。这会使我们的代码压缩很多,并且无需嵌套订阅。

最后一个......

Demo