【问题标题】:How do I return an array instead of a FirebaseListObservable如何返回数组而不是 FirebaseListObservable
【发布时间】:2017-04-08 19:19:29
【问题描述】:

我有 ng2-charts 在我的 Angular-cli 构建应用程序上工作。我很新,所以任何帮助表示赞赏。我在 Firebase 上有数据设置。我在服务中创建了一个方法来访问该数据,并且当我使用此代码时

getGraphData():Observable<any>{
        var graphData$ = this.af.database.list(`graphdata/${this.uid}`)
          .map(tspa => tspa.map(tpa => tpa.$value))
          .do(console.log);

        graphData$.subscribe();
        return Observable.of([]);
 }

控制台记录正确的数据。

例如。 [1000, 5000, 2000]

问题是当我更改返回结果的方法时:

getGraphData():Observable<any>{
        return this.af.database.list(`graphdata/${this.uid}`)
          .map(tspa => tspa.map(tpa => tpa.$value))
}

并尝试将其分配给组件中的变量。我总是得到以下控制台日志:

>FirebaseListObservable

我见过不同的方法来获得我想要的结果,例如使用flatMapObservable.combineLatest(),但我无法获得任何其他结果。我有 json 数据,我想将其作为数组分配给一个变量,以便在我的条形图中显示它。

graph.ts

  data$: any;
  form$: any;

  public barChartLabels:string[] = ['Account1', 'Account2', 'Account3', 'Account4', 'Account5', 'Account6', 'Account7'];
  public barChartType:string = 'bar';
  public barChartLegend:boolean = true;

  firstVar:any = [28, 48, 40, 19, 86, 27, 90];
  secondVar:any = [28, 48, 40, 19, 86, 27, 90];

  public barChartData:any[] = [
    {data: this.firstVar, label: 'Series A'},
    {data: this.secondVar, label: 'Series B'}
  ];

我想分配 firstVar 新的 Firebase 数据。有什么建议吗?

我通常这样访问方法:

 ngOnInit() {
    this.firstVar = this.transactionsS.getGraphData();
    console.log(this.firstVar)

  }

updateGraph(){
   this.firstVar = this.transactionsS.getGraphData()
    console.log(this.firstVar)

}

【问题讨论】:

    标签: angular firebase firebase-realtime-database angular2-services ng2-charts


    【解决方案1】:

    你没有正确使用 Observables,记住它是异步的。

    关于 Observables 的简要说明:
    “RxJS 是一个使用可观察序列组成异步和基于事件的程序的库。”
    Observables 基于Observer/Subscriber pattern。基本上,不要考虑数据,要考虑事件
    当你使用这个 return this.af.database.list('graphdata/${this.uid}') 时,会创建一个 observable,它等待表示异步调用完成的事件(即数据收集或错误)。 observers 或 rxjs 中使用的术语 -subscribers 必须在 obserbale 中注册以告诉它 wwe 对您的事件感兴趣,如果有一些数据,请传递给我们。一个 observable 可以有多个订阅者。
    在您的情况下,无需使用平面图,只需按原样传递数组并设置subscriber(val =&gt; this.firstVar=val)

    getGraphData():Observable<any>{
      // create observable and add map operator for data to be sent to subscriber 
       return this.af.database.list(`graphdata/${this.uid}`)
              .map(tspa => tspa.map(tpa => tpa.$value));
    }
    
    
    firstVar:string[] = []; 
    ngOnInit() {
        // use subscribe to capture published data
        this.transactionsS.getGraphData().subscribe((val)=> this.firstVar=val);
        console.log(this.firstVar); // this will not work 
    
      }
    
    updateGraph(){
       this.transactionsS.getGraphData().subscribe((val) => this.firstVar=val);
    
    }
    

    rxjs 有很好的文档,检查一下here

    【讨论】:

    • 谢谢。我仍然需要学习我会阅读文档。我注意到你的解决方案我没有得到想要的结果,但至少我更接近了。我必须将.flatMap(list =&gt; list) 添加到getGraphData() 方法的末尾,以获得包含我想要的数据的数组。一个可能不相关的问题,flatMap 通常会复制数据吗?我得到的是[1000, 1000, 5000, 1000, 1000, 5000],而不是[1000, 1000, 5000] 的数组。 ngOnit 只会将 val 推送到 firstVar 一次,对吗?
    • 其实我知道发生了什么,但不知道如何解决它。当您订阅 observable 时,我注意到控制台日志将从一个空数组开始,然后用一个新实例填充它,并重复直到完成。所以在这3个项目中。它是 [ ] 然后 [1000] 然后 [1000, 5000] 然后 [1000, 5000, 1000] 所以我的结束数组将所有六个整数填充到一个数组中,因为我相信 push 命令会导致 [1000, 1000, 5000, 1000、5000、1000]。除了推送还有其他选择吗?我想像 set 这样的东西会起作用。
    猜你喜欢
    • 2020-06-29
    • 2021-08-17
    • 1970-01-01
    • 2021-07-05
    • 2019-05-14
    • 2016-06-27
    • 2020-07-15
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多