如何在类方法内部正确调用自身?解决this指向报错问题
问题解决:
this.checkDB is not a function 错误原因及修复要点
this指向异常:fs.readdir的普通函数回调会重新绑定this,导致回调内的this不再指向DataHandler实例,无法访问checkDB方法。- 赋值操作误用为判断:
err.code = 'ENOENT'是赋值语句,而非判断错误类型的比较,应改为严格相等===。 - 未正确递归调用:原代码仅返回
checkDB函数引用,未执行调用,且未处理递归后的Promise状态传递。 - Promise未正常结束:
fs.readdir成功时未调用resolve,导致Promise一直处于pending状态。
修复后的代码(回调版本)
const fs = require('fs'); const writeFileAtomic = require('write-file-atomic'); class DataHandler { constructor() { } checkDB() { return new Promise((resolve, reject) => { // 改用箭头函数保留外层this指向 fs.readdir('./database', (err, files) => { if (err) { // 严格相等判断错误类型 if (err.code === 'ENOENT') { fs.mkdir('./database', (mkdirErr) => { if (mkdirErr) { return reject(mkdirErr); } // 递归调用并传递Promise状态 this.checkDB().then(resolve).catch(reject); }); } else { reject(err); } } else { console.log(files); resolve(files); // 成功时结束Promise } }); }); } } module.exports = DataHandler;
更简洁的async/await版本
利用fs.promisesAPI简化代码,避免回调地狱和this指向问题:
const fs = require('fs').promises; const writeFileAtomic = require('write-file-atomic'); class DataHandler { constructor() { } async checkDB() { try { const files = await fs.readdir('./database'); console.log(files); return files; } catch (err) { if (err.code === 'ENOENT') { await fs.mkdir('./database'); return this.checkDB(); // 递归调用 } throw err; } } } module.exports = DataHandler;
内容的提问来源于stack exchange,提问作者Bob Boby
相关产品推荐
相关产品推荐

