大多数情况下,我们都会使用异步的方式读取文件,这样性能会好一点。但是如果我们想要将读取的文件内容通过函数返回值返回或者通过 ctx.body 向客户端响应数据的话,就会带来因为异步发生的错误。比如:
function readFileFun() {
let dataObj;
fs.readFile(fpath, (err, data) => {
if (err) {
console.log(err);
}
dataObj = JSON.parse(data.toString());
})
return dataObj;//undefined
}
上述情况中,因为数据读取是异步的,回调函数会最后执行,所以 dataObj 中并不会有数据。
解决方式有两种:使用promise 或者使用 callback 回调;
我们先看一下 promise:
function readFileFun () {
let dataObj;
return new Promise(function (resolve, reject) {
fs.readFile(path.resolve(__dirname, '../../mock/index.json'), function (err, data) {
if (err) {
reject(err);
}
dataObj = JSON.parse(data.toString());
resolve(dataObj);
});
})
}
await readFileFun().then(function (dataObj) {
// console.log(dataObj);
ctx.body = dataObj;//成功返回
}).catch(function (err) {
console.log(err);
})
需要注意的是,这里 readFileFun() 前面一定要加上 await,等待异步执行完才继续,否则 ctx.body 响应的将是空内容,因为该函数内部执行的是异步操作。
当然我也尝试过使用 callback 方式,但是出现了一点问题:
function readFileFun () {
fs.readFile(fpath, (err, data) => {
if (err) {
console.log(err);
}
dataObj = JSON.parse(data.toString());
callback(dataObj);
})
}
await readFileFun(path.resolve(__dirname, './mock/index.json'), (dataObj) => {
console.log(dataObj)//能取到数据
ctx.body = dataObj;//但不能响应回去
})
这时候,能在回调中取到异步读取的数据,但是想将它通过 ctx.body 响应回客户端就不行,前面加上 await 也不行?
不知道有没有大佬帮忙看一下?