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


解决方案
你需要等待两个异步请求都完成后,再进行数值比较。可以使用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
相关产品推荐
相关产品推荐

