You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

车辆里程提醒应用中Firebase数值求和比较报错问题

问题分析

你遇到的核心问题是异步操作的执行顺序问题。Firebase的read_Rappel()和read_Voiture()都是异步的Observable,它们的subscribe回调会在数据从数据库返回后才执行,但你写的if判断是在ngOnInit的同步代码块里——这时候this.voitures和this.rappels还没有被赋值(或者还没拿到数据),直接访问this.voitures[0]和this.rappels[0]自然会抛出无法读取属性的错误。

错误截图

错误场景1
错误场景2

解决方案

你需要等待两个异步请求都完成后,再进行数值比较。可以使用RxJS的forkJoin操作符来合并这两个Observable,确保两者的数据都加载完成后再执行后续逻辑:

import { forkJoin } from 'rxjs'; // 记得导入forkJoin

constructor(private crudService: RappelService,private cr:VoitureService) { }

ngOnInit() {
  // 合并两个异步请求,等待两者都返回数据
  forkJoin([
    this.crudService.read_Rappel(),
    this.cr.read_Voiture()
  ]).subscribe(([rappelData, voitureData]) => {
    // 处理维护计划数据
    this.cvoiture = localStorage.getItem("idvoiture");
    this.rappels = rappelData.map(e => {
      return {
        id: e.payload.doc.id,
        isEdit: false,
        text: e.payload.doc.data()['text'],
        rappelNom: e.payload.doc.data()['rappelNom'],
        rappelKilo: e.payload.doc.data()['rappelKilo'],
        cvoiture: e.payload.doc.data()['voiture'],
        rappelService: e.payload.doc.data()['rappelService'],
      };
    });
    console.log(this.rappels);

    // 处理车辆数据
    this.voitures = voitureData.map(e => {
      return {
        id: e.payload.doc.id,
        isEdit: false,
        text: e.payload.doc.data()['text'],
        mat: e.payload.doc.data()['mat'],
        date: e.payload.doc.data()['date'],
        description: e.payload.doc.data()['description'],
        id_user: e.payload.doc.data()['id_user'],
        kilo: e.payload.doc.data()['kilo']
      };
    });
    console.log(this.voitures);

    // 现在两个数据都已加载,执行比较逻辑
    if (this.voitures.length > 0 && this.rappels.length > 0) {
      const currentKilo = this.voitures[0].kilo;
      const targetKilo = this.rappels[0].rappelKilo + this.rappels[0].rappelService;
      
      console.log(currentKilo);
      console.log(targetKilo);
      
      if (currentKilo < targetKilo) {
        console.log(this.rappels[0].rappelNom);
      }
    } else {
      console.log("车辆或维护计划数据为空,请检查数据库");
    }
  });
}
额外注意事项
  • 一定要先判断this.voitures和this.rappels的长度是否大于0,避免数组为空时访问[0]出现错误。
  • 确保从Firebase读取的kilo、rappelKilo、rappelService都是数值类型,如果是字符串格式,需要先转换为数字(比如用Number()或者parseInt()),否则字符串相加会变成拼接,导致比较逻辑完全错误。
  • 你之前代码里的this.cvoiture=localStorage.getItem("idvoiture");放到forkJoin的回调里更合理,能确保在处理数据时已经拿到了车辆ID。

内容的提问来源于stack exchange,提问作者MOHAMED

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:56:59