如何在Promise中访问类属性?解决Promise访问类属性报错问题
解决Promise中无法访问类属性的问题
这个问题我之前踩过坑!核心原因就是Promise回调函数里的this指向变了,不再指向你的Bale类实例,所以访问this.bot才会抛出TypeError: Cannot read property 'bot' of undefined。
为什么会这样?
当你用普通函数作为Promise的执行体或者then/catch的回调时,这个函数的this会默认指向全局对象(浏览器里是window,Node.js里是global),而不是你的类实例。这就导致你找不到类里的bot属性了。
三种可行的解决方案
1. 用箭头函数(最推荐,ES6+)
箭头函数不会创建自己的this,它会继承外层作用域的this,也就是你的Bale类实例。比如修改你的方法:
class Bale { constructor(bp, config) { this.bot = new SDK.Bot(config); // 假设你在构造函数里初始化了bot // ...其他构造逻辑 } // 改成返回Promise的方法 yourMethod() { return new Promise((resolve, reject) => { // 这里的this就是Bale类的实例,能正常访问this.bot this.bot.doSomething() .then(result => resolve(result)) .catch(err => reject(err)); }); } }
2. 提前保存this到变量
如果你的环境不支持ES6箭头函数,可以在方法开头把类实例的this存成一个变量(比如self/that),然后在Promise回调里用这个变量访问属性:
class Bale { constructor(bp, config) { this.bot = new SDK.Bot(config); // ... } yourMethod() { const self = this; // 保存类实例的this return new Promise(function(resolve, reject) { // 用self代替this访问类属性 self.bot.doSomething() .then(result => resolve(result)) .catch(err => reject(err)); }); } }
3. 用bind()绑定上下文
你还可以用函数的bind()方法,把Promise回调的this强制绑定到类实例上:
class Bale { constructor(bp, config) { this.bot = new SDK.Bot(config); // ... } yourMethod() { return new Promise(function(resolve, reject) { this.bot.doSomething() .then(result => resolve(result)) .catch(err => reject(err)); }.bind(this)); // 绑定this到类实例 } }
额外提醒
如果你用的是Bluebird Promise(你代码里引入了bluebird),它还支持一些更灵活的上下文绑定方式,但上面三种方法已经足够解决你的问题了。优先推荐箭头函数,代码更简洁直观,也符合现代JS的写法。
内容的提问来源于stack exchange,提问作者ali akbar azizkhani
相关产品推荐
相关产品推荐

