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

使用Promises/Async设置类属性遇到初始化问题

解决你的类属性初始化问题

我仔细看了你的代码,发现几个关键问题导致Promise相关的属性初始化不顺畅,咱们一步步来修正:

1. 方法语法错误

你的getThing少了方法定义的括号,正确写法应该带():

getThing() {
  return this['_thing']
}

没有括号的话,JS会把它当成未赋值的属性,调用时直接报错。

2. 异步操作未等待结果

在init方法里,requestThing返回的是Promise,但你直接把这个Promise赋值给了this._thing,而不是等待它resolve后的实际响应值。因为init是async函数,你可以用await来等待Promise完成:

async init() {
  this._thing = await this.requestThing(this['_id'])
}

这样this._thing才会被赋值为请求返回的response,而不是一个Promise对象。

3. 正确的实例使用方式

修改完代码后,使用类的时候要记得等待init方法执行完成,否则直接调用getThing会拿到未初始化的空数组或者Promise对象:

// 正确用法示例
async function useMyClass() {
  const myInstance = new MyClass(123);
  await myInstance.init(); // 必须等待初始化完成
  console.log(myInstance.getThing()); // 这里才能拿到正确的响应数据
}

useMyClass();

修正后的完整代码

class MyClass {
  constructor(id) {
    this._id = id
    this._thing = []
  }
  getThing() { // 修复方法语法
    return this['_thing']
  }
  async init() {
    this._thing = await this.requestThing(this['_id']) // 添加await等待结果
  }
  requestThing(id) {
    return new Promise((resolve) => {
      // 模拟请求逻辑
      const response = `ID为${id}的请求响应数据`;
      resolve(response);
    })
  }
}

另外,如果想避免每次创建实例都手动调用init,可以考虑在constructor里启动初始化,但因为constructor不能是async函数,你可以用立即执行的async函数处理,注意要做好错误捕获:

constructor(id) {
  this._id = id
  this._thing = []
  // 自动初始化,同时捕获可能的错误
  (async () => {
    try {
      await this.init();
    } catch (err) {
      console.error('初始化失败:', err);
    }
  })();
}

不过这种方式会让初始化变成“后台”操作,还是更推荐显式调用init并等待,这样代码逻辑更清晰,不容易出现异步时序问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:41:23