javascript - 如何返回具有 Angular 可观察值的数字/变量?

标签 javascript angular typescript service observable

我有一个 Angular 服务调用 API 并返回大量数据。在同一个 GET 调用中,我正在执行一些逻辑来计算每种类型的数量。我的问题很简单,我可以将该变量/数字与数据一起发回,甚至可以将其保存到另一个变量并发送吗?

当我尝试将它作为公共(public)变量保存到服务时,当我尝试将它拉入另一个组件时它是未定义的。我假设是因为在订阅 observable 之前访问了变量,但我不知道如何解决这个问题?

在下面的代码中,_counts 是我要返回的,它在 getPciInfo 方法中的日志记录工作正常,但就像我说的,它在其他任何地方返回时都是未定义的。 (我试图将这个数字传递给不同的组件)。

感谢您提供的任何帮助或建议。

public _counts: any;

getPciInfo(): Observable <Ipcidata[]> {
    return this.httpClient.get<Ipcidata[]>('http://dr0-hlp-07/api/PCIMachines')
      .pipe(
              map(results => {

                const sorted = results.sort(( a, b ) => {
                      const updateDateA = Date.parse(this.datepipe.transform(a.UpdatedDate, 'MM-dd-yyyy'));
                      const carda = determineCardType(a, this.dateMinusMonth, this.dateMinusTwoWeeks)
                      const cardb = determineCardType(b, this.dateMinusMonth, this.dateMinusTwoWeeks)

                      return cardb - carda
                });

                this._counts = sorted.reduce((acc, cur)=>{
                  const cardType = determineCardType(cur, this.dateMinusMonth, this.dateMinusTwoWeeks)

                  switch (cardType) {
                    case 1:
                      acc.green += 1;
                      break;
                    case 2:
                      acc.yellow += 1;
                      break;
                    case 3:
                      acc.red += 1;
                      break;
                  }
                  return acc;
                }, {
                  red: 0,
                  green: 0,
                  yellow: 0
                });
                console.log(this._counts)
                console.log(this._counts.red)

          return sorted;
          }


最佳答案

要发回您可以执行的计数:

return ({sorted, counts: _counts});

要跨此服务的组件共享它,您可以有一个主题,例如:

private countsSource = new Subject();
private counts = this.countsSource.asObservable();

getPciInfo(): Observable <Ipcidata[]> {
    return this.httpClient.get<Ipcidata[]>('http://dr0-hlp-07/api/PCIMachines')
      .pipe(
              map(results => {
                 ....
                 const counts = ...
                 this.countsSource.next(counts)
              });
}

getCounts(): Observable<CountData> {
     return this.counts;
}

在一个组件中,您可以像使用其他函数一样使用它

this.myService.getCounts().subscribe(counts => console.log(counts));

如果您希望将计数发送到新订阅,您可能必须使用 BehaviorSubjectReplaySubject

关于javascript - 如何返回具有 Angular 可观察值的数字/变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58169130/

相关文章:

angularjs - 如何使用不污染全局范围的 TypeScript 类定义 AngularJS 服务?

javascript - 返回包含特定单词的字符串的新数组

javascript - 用于获取数据的自定义 react Hook 在第二次点击时不会提供数据

angular - get/set 已被弃用,取而代之的是 config 命令

javascript - Angular 16+ 中的注入(inject)上下文是什么

Angular 从子组件传递值以禁用父组件中的按钮

Angular 2 : convert array to Observable

javascript - 删除 Bootstrap 下拉插入符

javascript - 自定义选择标签功能

javascript - 如何将 JSON(在订阅中)分配给 Angular 变量