Javascript 如何返回一个角度可观测的数字/变量?

Javascript 如何返回一个角度可观测的数字/变量?,javascript,angular,typescript,service,observable,Javascript,Angular,Typescript,Service,Observable,我有一个angular服务调用API并返回大量数据。在同一个GET调用中,我正在进行一些逻辑运算,计算每种类型有多少个。我的问题很简单,我是否可以将该变量/数字和数据一起发送回,或者将其保存到另一个变量并发送 当我试图将其作为公共变量保存到服务中时,当我试图将其拉入另一个组件时,它是未定义的。我假设是因为变量在订阅可观察对象之前被访问,但我不知道如何解决这个问题 在下面的代码中,_counts是我试图返回的内容,它在getPciInfo方法中运行良好,但正如我所说的,它在其他任何地方返回时都是未

我有一个angular服务调用API并返回大量数据。在同一个GET调用中,我正在进行一些逻辑运算,计算每种类型有多少个。我的问题很简单,我是否可以将该变量/数字和数据一起发送回,或者将其保存到另一个变量并发送

当我试图将其作为公共变量保存到服务中时,当我试图将其拉入另一个组件时,它是未定义的。我假设是因为变量在订阅可观察对象之前被访问,但我不知道如何解决这个问题

在下面的代码中,_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;
          }


public\u计数:任意;
getPciInfo():可观察{
返回此.httpClient.get('http://dr0-hlp-07/api/PCIMachines')
.烟斗(
地图(结果=>{
常量排序=结果排序((a,b)=>{
const updateDateA=Date.parse(this.datepipe.transform(a.updatedate,'MM-dd-yyyy'));
const carda=determineCardType(a,this.dateminsMonth,this.dateminsTwoWeeks)
const cardb=determineCardType(b,this.dateminsMonth,this.dateminsTwoWeeks)
返回卡B-卡
});
此._计数=已排序.减少((acc,cur)=>{
const cardType=determineCardType(cur,this.dateminsMonth,this.dateminsTwoWeeks)
开关(卡式){
案例1:
acc.绿色+=1;
打破
案例2:
acc.黄色+=1;
打破
案例3:
acc.red+=1;
打破
}
返回acc;
}, {
红色:0,,
绿色:0,
黄色:0
});
console.log(此.\u计数)
console.log(此._counts.red)
返回排序;
}

要发回计数,您可以执行以下操作:

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;
}

如果要将计数发送到新订阅,可能必须使用
BehaviorSubject
ReplaySubject

返回({sorted,counts:_counts})
在订阅中,您可以获得
result.sorted
result.counts
。或者,如果您想单独订阅
counts
,您可以为
设置一个
主题。这就是我要寻找的,但是我得到了以下错误,我假设是因为我没有指定额外的变量作为返回?
类型“Observable”不可分配给类型“Observable”
不确定在何处执行此操作,因为我无法在getPciInfo()中执行此操作方法没有错误。您只需将该方法的返回类型更改为
Observable
,因为您不再返回
Observable
。或者为Ipcidata+count创建一个iterface并将其用作返回类型。这很有效,我只是没有将其作为返回类型正确地添加到括号中,谢谢。!
this.myService.getCounts().subscribe(counts => console.log(counts));