异步内部的函数返回为未定义:Angular

function inside async returning as undefined: Angular

提问人:user3774763 提问时间:11/15/2023 最后编辑:MoxxiManagarmuser3774763 更新时间:11/15/2023 访问量:35

问:

我正在尝试使用 SSE 订阅 API 调用,

addAsArray(message){
   array.push(message)
}

上交所的调用:

let src = fetchEventSource('api link', {
method: 'POST',
...
async onmessage(e){
   if(e.text.includes('[END]')){
      this.addAsArray(e.text)
   }
}

但是,我收到此错误:TypeError: Cannot read properties of undefined (reading 'addAsArray')

我知道异步函数可能需要,因此我尝试这样做await

async addAsArray(message){
   array.push(message)
}

上交所的调用:

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

但是,我仍然收到相同的错误。我在这里做错了什么?

angularjs 异步 async-await

评论


答:

1赞 Den 11/15/2023 #1

在您的例子中,onmessage 函数中的这个似乎是未定义的。这是因为 onmessage 函数创建自己的上下文,而该函数内部的上下文不引用外部作用域。

解决此问题的一种方法是为 onmessage 使用箭头函数,该函数没有自己的 this,并将从父作用域继承它。以下是修改代码的方法:

let src = fetchEventSource('api link', {
  method: 'POST',
  ...
  onmessage: async (e) => {
    if(e.text.includes('[END]')){
      this.addAsArray(e.text)
    }
  }
});