大多數(shù)情況下纺涤,我們都會(huì)使用異步的方式讀取文件数焊,這樣性能會(huì)好一點(diǎn)疯搅。但是如果我們想要將讀取的文件內(nèi)容通過(guò)函數(shù)返回值返回或者通過(guò) ctx.body 向客戶端響應(yīng)數(shù)據(jù)的話,就會(huì)帶來(lái)因?yàn)楫惒桨l(fā)生的錯(cuò)誤健爬。比如:
function readFileFun() {
let dataObj;
fs.readFile(fpath, (err, data) => {
if (err) {
console.log(err);
}
dataObj = JSON.parse(data.toString());
})
return dataObj;//undefined
}
上述情況中控乾,因?yàn)閿?shù)據(jù)讀取是異步的,回調(diào)函數(shù)會(huì)最后執(zhí)行娜遵,所以 dataObj 中并不會(huì)有數(shù)據(jù)蜕衡。
解決方式有兩種:使用promise 或者使用 callback 回調(diào);
我們先看一下 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慨仿,等待異步執(zhí)行完才繼續(xù),否則 ctx.body 響應(yīng)的將是空內(nèi)容纳胧,因?yàn)樵摵瘮?shù)內(nèi)部執(zhí)行的是異步操作镰吆。
當(dāng)然我也嘗試過(guò)使用 callback 方式,但是出現(xiàn)了一點(diǎn)問(wèn)題:
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)//能取到數(shù)據(jù)
ctx.body = dataObj;//但不能響應(yīng)回去
})
這時(shí)候跑慕,能在回調(diào)中取到異步讀取的數(shù)據(jù)万皿,但是想將它通過(guò) ctx.body 響應(yīng)回客戶端就不行,前面加上 await 也不行核行?
不知道有沒(méi)有大佬幫忙看一下牢硅?