从服务返回订阅-但是如何在服务中也使用异步结果?

时间:2019-04-04 14:37:01

标签: javascript angular angular-httpclient

对不起,标题不好,我真的不知道该如何措辞。

假设我在Angular组件的某处进行了服务调用,例如:

this.myService.postObject(object).subscribe((serverData) => {
  console.log('Server Name:' + serverData.name)
});

当MyService看起来像这样时,这当然可以完美地工作:

postObject(dataObject: MyObject) {
  return this.http.post(`http://server/object`, dataObject);
}

但是当我想对异步结果做出反应时,不仅要在订阅中单独响应,而且还要对所有调用进行响应,所以理想的是这样的:

postObject(dataObject: MyObject) {
  return this.http.post(`http://server/object`, dataObject)
    .subscribe(
      (serverData) => {
        console.log('Server Name:' + serverData.name)
      })
}
  

这当然是行不通的,因为我无法返回.subscribe,然后再次对其进行.subscribe。

但是我想到了日志,消息传递和其他一般活动,在执行帖子时需要完成这些事情。

有没有办法做到这一点,还是我只是盲目看? :-(

1 个答案:

答案 0 :(得分:2)

这就是tap的用途,tap不会修改返回的可观察值,但可以处理日志记录之类的事情。如果要修改返回的Obsertvable,请改用map

postObject(dataObject: MyObject) {
  return this.http.post(`http://server/object`, dataObject)
    .pipe(tap(serverData => {
        console.log('Server Name:' + serverData.name)
      }))
}
  

RxJS tap操作符(如“窃听”中所述)使代码可以检查通过可观察对象的良好和错误值,而不会干扰它们。

https://angular.io/guide/http