【问题标题】:Return Subscription from Service - but how to use async result also in Service?从服务返回订阅 - 但如何在服务中使用异步结果?
【发布时间】:2019-04-04 22:45:18
【问题描述】:

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

假设我在 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 到它。

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

有没有办法做到这一点,还是我只是瞎了眼? :-(

【问题讨论】:

    标签: javascript angular angular-httpclient


    【解决方案1】:

    这就是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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 2021-08-06
      • 1970-01-01
      • 2020-10-02
      • 2013-03-22
      相关资源
      最近更新 更多