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

Angular中使用SSE调用API时this指向错误致addAsArray调用失败

问题分析与解决

错误原因

你遇到的TypeError: Cannot read properties of undefined (reading 'addAsArray')和异步函数是否加await无关,核心问题是**onmessage回调里的this指向错误**。

在fetchEventSource的配置对象中,onmessage作为独立的异步函数,它内部的this默认指向配置对象(严格模式下甚至是undefined),而非你定义addAsArray方法的上下文(比如类实例、Vue组件实例等)。

解决方案

以下几种方式可以修正this的指向:

1. 使用箭头函数

箭头函数会继承外层作用域的this,直接修改onmessage的定义形式:

let src = fetchEventSource('api link', {
  method: 'POST',
  // ...其他配置项
  onmessage: async (e) => {
    if(e.text.includes('[END]')){
      await this.addAsArray(e.text)
    }
  }
})

2. 提前保存正确的this

在配置对象外把正确的上下文保存到变量中,回调里用这个变量替代this:

const that = this;
let src = fetchEventSource('api link', {
  method: 'POST',
  // ...其他配置项
  async onmessage(e){
    if(e.text.includes('[END]')){
      await that.addAsArray(e.text)
    }
  }
})

3. 用bind绑定this

通过Function.prototype.bind方法,把回调函数的this强制绑定到正确的上下文:

let src = fetchEventSource('api link', {
  method: 'POST',
  // ...其他配置项
  onmessage: async function(e){
    if(e.text.includes('[END]')){
      await this.addAsArray(e.text)
    }
  }.bind(this)
})

另外补充:你的addAsArray方法里的array如果是实例属性,建议加上this.(即this.array.push(message)),避免出现变量未定义的额外问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:23:14