使用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
相关产品推荐
相关产品推荐

