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

Angular调用API取数后读取timestamp报Cannot read properties of undefined错误

问题根因汇总

1. 构造函数初始化dataResults的遍历方式错误

你使用for...in遍历数组dataArray,for...in遍历数组时返回的是数组索引字符串("0"、"1"、"2"),而非你期望的import、cron、delta这类业务类型值。这就导致初始化后dataResults的键是"0"、"1"、"2",你需要的import、cron等业务键在初始状态下根本不存在,值为undefined。

2. 未初始化的export键直接触发报错

你在dataArray中注释掉了export项,所以既没有初始化dataResults['export'],也不会发起对应的API请求给它赋值,但模板中仍然使用了exportTimestamp,对应的getter访问this.dataResults['export']时拿到的是undefined,再读取timestamp属性就会抛出类型错误。

3. 异步请求时序问题

API请求是异步的,在所有请求返回前模板就会执行首次渲染,此时除了先返回的delta外,import、cron对应的键还未被赋值,也会触发临时的undefined错误。


修复方案

1. 修正初始化遍历逻辑

把构造函数中的for...in改为for...of遍历,拿到正确的业务类型作为键:

// 修正前错误写法
// for (var val in this.dataArray) {
//   this.dataResults[val] = {} as StatusElementInterface;
// }

// 修正后写法
for (const val of this.dataArray) {
  this.dataResults[val] = {} as StatusElementInterface;
}

2. 处理export字段

要么在dataArray中恢复export项,要么在模板中删掉exportTimestamp相关的渲染逻辑,也可以用可选链简化getter的空值判断,避免报错:

get exportTimestamp():number|undefined{
  return this.dataResults['export']?.timestamp ? Number(this.dataResults['export'].timestamp) * 1000 : undefined;
}

3. 修正类型定义与返回值转换

你当前接口返回的是单个StatusElementInterface类型的对象,不是StatusInterface类型的键值对集合,同时返回的timestamp是字符串类型,和你定义的number类型不匹配,建议调整请求逻辑:

this._httpClient.get<StatusElementInterface>(requestUrl)
  .pipe(
    map(data => {
      // 字符串时间戳转数字,匹配接口定义
      if(data.timestamp) data.timestamp = Number(data.timestamp)
      return data
    })
  )
  .subscribe(data => {
    this.dataResults[val] = data;
  })

内容的提问来源于stack exchange,提问作者Henning Möllendorf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:09:00