面向对象封装fs模块时自定义方法返回undefined问题求解
问题原因分析
- 异步回调返回值无法向外传递:
fs.readFile是异步回调式API,你在回调函数内部写的return data.toString()只会将值返回给回调函数本身,完全无法传递到外层的readFileAsync方法。同时readFileAsync本身没有定义返回值,执行后默认返回undefined。 - 箭头函数导致this指向错误:用箭头函数定义类方法时,箭头函数的
this会绑定定义时上层作用域的this,不会指向类的实例对象,this.filename大概率无法取到你预期的文件路径,属于隐藏的逻辑错误。
修复方案
建议用Promise封装适配现在主流的async/await调用方式,同时修正this指向问题:
// 改用普通函数定义类方法,保证this指向实例 readFileAsync = function() { return new Promise((resolve, reject) => { fs.readFile(this.filename, (err, data) => { if (err) return reject(err) resolve(data.toString()) }) }) }
调用时使用await或者then接收返回值:
// async/await 调用(需放在async函数内) const fileContent = await 你的实例对象.readFileAsync() // then 回调调用 你的实例对象.readFileAsync().then(content => { console.log(content) })
如果是Node.js v10以上版本,也可以直接用内置的Promise版fs API简化封装:
const fsp = require('fs/promises') // 类内定义异步方法 async readFileAsync() { const data = await fsp.readFile(this.filename) return data.toString() }
内容的提问来源于stack exchange,提问作者user16015333
相关产品推荐
相关产品推荐

