这是我经常发现自己陷入的一种模式,我不知道为什么,或者什么是实现我目标的正确方式.

我需要一个number的值,许多计算都依赖于它,但这个值需要从可观测对象中检索.

我在服务中使用了我的组件可以调用的GET方法,但我总是很难找到正确的模式来实现这一点.

我的服务方式:

getMarketCap(company: Company): number {
    combineLatest([
      this.getPrevDayClose(company.ticker),
      this.getCurrDayLastPrice(company.ticker),
      this.getWsLastPrice(company.ticker)
    ]).pipe(
      tap(([prevDayClose, currDayLastPrice, wsLastPrice]) => {
        if (wsLastPrice) {
          this.price = wsLastPrice;
        } else if (currDayLastPrice) {
          this.price = currDayLastPrice;
        } else {
          this.price = prevDayClose;
        }

        return this.price * this.getSharesOutstanding(company);
      })
    );
  }

这是行不通的,因为包含我想要的值的返回值在tap以内.

我的组件是一个公司列表,我只需在ngOnInit()中 for each 公司调用this.service.getMarketCap(company).有没有一种简单的方法可以在设置后将this.price的值提取出来,以便被服务中的其他计算方法消费?

我以前用组件方法做过类似的事情,但我能够在组件级别设置变量,因为它一次只为一家公司设置.

服务是不是不适合这个逻辑?

推荐答案

有没有一种简单的方法可以在设置后将this.price的值从那里取出来,以便被服务中的其他计算方法消费?

正如D M在上面提到的,您应该让您的方法返回Observable<number>. 然后,您可以将您的输入可观测源map到您的"价格"值,并在一个单独的可观测值中完成getSharesOutstanding项工作:

  getPrice(ticker: string): Observable<number> {
    return combineLatest([
      this.getPrevDayClose(ticker),
      this.getCurrDayLastPrice(ticker),
      this.getWsLastPrice(ticker),
    ]).pipe(
      map(([prevDayClose, currDayLastPrice, wsLastPrice]) => wsLastPrice ?? currDayLastPrice ?? prevDayClose)
    );
  }

  getMarketCap(company: Company): Observable<number> {
    return this.getPrice(company.ticker).pipe(
      map(price => price * this.getSharesOutstanding(company))
    );
  }

现在,服务中的其他位置可以使用this.getPrice(),并且当任何源可观测数据发生变化时,所有这些位置都将被更新.

Typescript相关问答推荐

如何使用另一个类型的属性中的类型

使用Angular和API请求在CRUD操作后更新客户端数据的良好实践

将值添加到具有不同类型的对象的元素

在键和值为ARGS的泛型函数中未正确推断类型

泛型类型,引用其具有不同类型的属性之一

为什么我的Set-Cookie在我执行下一次请求后被擦除

如何编写一个类型脚本函数,将一个对象映射(转换)为另一个对象并推断返回类型?

通过字符串索引访问对象';S的值时出现文字脚本错误

如何将定义模型(在Vue 3.4中)用于输入以外的其他用途

使用泛型识别对象值类型

顶点堆叠的图表条形图未在正确的x轴上显示

任何导航器都未处理有效负载为";params";:{";roomId";:";...";}}的导航操作

在打印脚本中将对象类型转换为数组

递归类型别名的Typescript 使用

如何使用angular15取消选中位于其他组件中的复选框

为什么`map()`返回类型不能维护与输入相同数量的值?

TypeScript中的这些条件类型映射方法之间有什么区别?

如何在由函数参数推断的记录类型中具有多个对象字段类型

如何在Typescript 中定义具有相同类型的两个泛型类型的两个字段?

如果父级被删除或删除,如何自动删除子级?