Angular 将 Observable<any> 实现为同步字符串 [] 数组

Posted

技术标签:

【中文标题】Angular 将 Observable<any> 实现为同步字符串 [] 数组【英文标题】:Angular implement Observable<any> as synchronous string[] array 【发布时间】:2021-12-13 10:30:38 【问题描述】:

我正在尝试获取保存到 firebase 的信息并动态使用它来填充 ng2-chart 的数组。

我目前遇到的问题是 observable 不允许我填充这个数组。

getEntries(id) 
this.entries2 = this.dataService.getEntries(id);

let datesarr: string[] = [];
let arr = [];
this.dataService.getEntries(id).subscribe((entry) => 
  entry.forEach(function (x) 
    arr.push(x);
  );

  for (let i = 0; i < arr.length; ++i) 
    //  console.log(arr[i].Q1);
    let x: string = arr[i].Q1;

    // console.log(x);
    datesarr.push(x);

    //this.barChartLabels.push(x); 
//Whenever I try to push this value it encounters an error. 
  
);

我是否误用了这个 observable 的订阅功能?如果是这样,我该如何解决?

之前我尝试使用以下sn-p:

getEntries(id) 
this.entries2 = this.dataService.getEntries(id);
let arr = [];
let datesarr: string[] = [];

this.entries2.forEach(function (entry) 
  entry.forEach(function (x) 
    arr.push(x);
  );
  for (let i = 0; i < arr.length; ++i) 
    
    let x: string = arr[i].Q1;
    
    datesarr.push(x);
    //this.barChartLabels.push(x);
  
);

我认为问题在于这个 observable 是异步的,并且 barchartlabels 行推送“未定义”而不是任何真实数据。

entries2 定义为:

   entries2: Observable<any>;

barchartlabels 只是一个空数组,我试图将数据推送到:

public barChartLabels: Label[] = [];

在dataService中从db中获取信息的代码是:

  getEntries(id)
   return  this.db.collection(`users/$id/entries`).valueChanges();
  

有人可以为我指出如何解决这个问题的正确方向吗?

注意:我已尝试查看主题,但不确定它们是否适合我的代码,因为返回流的最后一个值似乎并没有太大用处。

【问题讨论】:

你能指定你得到的错误吗? 我猜是类型问题,barChartLabels 需要一个 Label 数组。尝试对 Label => let push 进行强制转换: Label = x as Label; this.barChartLabels.push(pushed); 是的,就是类型错误。旁注,我是否正确使用订阅?我对 observables 和 angular 还是很陌生。 是的,它是正确的:虽然我会小心内存泄漏你应该有一个属性私有子:订阅。然后你像这样影响它: this.sub = this.dataService.getEntries(id).subscribe(.... 然后你在 ngOnDestroy 中取消订阅它: if (this.sub) this.sub.unsubscribe() 跨度> 【参考方案1】:

这似乎是类型问题。 this.barChartLabels 需要您指出的标签数组

this.barChartLabels: Label[] = [];

所以你只需尝试将 x 数据转换为标签:

getEntries(id) 
this.entries2 = this.dataService.getEntries(id);

let datesarr: string[] = [];
let arr = [];
this.dataService.getEntries(id).subscribe((entry) => 
  entry.forEach(function (x) 
    arr.push(x);
  );

  for (let i = 0; i < arr.length; ++i) 
    //  console.log(arr[i].Q1);
    let x: string = arr[i].Q1;

    // console.log(x);
    datesarr.push(x);

    this.barChartLabels.push(x as Label); // note as Label 

  
);

【讨论】:

天哪,谢谢! 好吧,这只是我的第一个猜测:类型问题。我正在编辑答案以更清楚 您也可以使用 '''typescript ''' 添加语法着色(使用勾号 ` 而不是引号'

以上是关于Angular 将 Observable<any> 实现为同步字符串 [] 数组的主要内容,如果未能解决你的问题,请参考以下文章

Angular4最佳实践之unsubscribe

Angular Observable 组件和服务交互

如何在 Angular 中管道/映射 Observable

Angular 6:将 Observable 响应传递给另一个 Observable

为啥 Angular 将 Observable 用于 HttpClient?

Angular 6 router.events.filter 'filter' 不存在于类型'Observable<Event>'