使用fs.readFile读取文件的异步问题

大多数情况下,我们都会使用异步的方式读取文件,这样性能会好一点。但是如果我们想要将读取的文件内容通过函数返回值返回或者通过 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 也不行?
不知道有没有大佬帮忙看一下?

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。