监控HttpClient数据 - 不要在订阅上发布数据

时间:2018-02-12 12:20:54

标签: angular typescript rxjs

我正试图找出一种方法来监控来自2个位置的HttpClient.Post observable的结果,而不会将数据发布到我的服务器两次。

我在这里创建了一个示例:https://stackblitz.com/edit/angular-aau9mg

目前我有app.service从服务器获取数据,然后在返回数据时,设置一个值:

public getDump():Observable<any> {
    var observable = this.http.get("https://angular-http-guide.firebaseio.com/courses.json");

    observable.subscribe(
      data => this.someValue = 99,
      error => console.log(error)
    );

    return observable;
  }

然后,在app.component我要禁用帖子按钮(dumpInProgress),然后在检索数据时,设置dump

getDump(){
    this.appService.getDump().subscribe(
      (data) => this.dump = data,
      () => { },
      () => this.dumpInProgress = false
    );
  }

因此,目前这完全符合预期,并取得了预期的效果。我遇到的问题是,如果您在单击获取转储按钮时检查网络日志,您将看到请求已进行两次!这是因为:

  

在您对该方法返回的observable上调用subscribe()之前,HttpClient方法不会开始其HTTP请求。对于所有HttpClient方法都是如此。 Source

那么可以在不进行第二次获取请求的情况下实现此结果吗?

1 个答案:

答案 0 :(得分:1)

我认为你需要的只是map功能:

public getDump():Observable<any> {
    return this.http.get("https://angular-http-guide.firebaseio.com/courses.json").map(
        data => { this.someValue = 99; return data; },
        error => console.log(error)
    );  
}
  

2请求背后的原因是,

this.appService.getDump().subscribe(...)
observable.subscribe(...)
     

这2行代码,您通过订阅两次拨打2个电话   

<强> WORKING DEMO