首页 > 解决方案 > 从服务返回订阅 - 但如何在服务中使用异步结果?

问题描述

抱歉标题不好,我真的不知道如何表达它。

假设我在 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 再次返回它。

但我想到了在帖子执行时需要完成的日志记录、消息传递和其他一般活动。

有没有办法实现这一点,或者我只是盲目地看到?:-(

标签: javascriptangularangular-httpclient

解决方案


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

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

RxJS tap 操作符(如“窃听”)让代码检查通过 observable 的正确和错误值,而不会干扰它们。

https://angular.io/guide/http


推荐阅读