javascript - Async/Await 函数,fs.readfile 并将其存储到变量中
问题描述
const fs = require('fs');
// const util = require('util');
let text = ``;
const files = [`head.txt`,`body.txt`,`leg.txt`,`feet.txt`];
let head,body,leg,feet = ``;
//const readFile = util.promisify(fs.readFile);
function isCompleted(err,data) {
if (err) {
throw err;
}
text = data.toString();
proceedData()
}
function proceedData() {
console.log(text);
return text;
}
function readFileBody() {
fs.readFile(files[1], 'utf8', isCompleted);
}
async function printFiles () {
//head = await fs.readFile(files[0], 'utf8', (err,data) => {if (err) {throw err;}else {head += ` ${data}`}});
body = await readFileBody();
//await fs.readFile(files[2], 'utf8', isCompleted);
//await fs.readFile(files[3], 'utf8', isCompleted);
}
printFiles();
当我在全局范围内 console.log(body) 时,它将返回一个未定义的。
当我在本地 printFile 函数中 console.log(body) (没有返回)时,它也会返回一个未定义的,但我在本地 isCompleted 中的 console.log(text) ,它会返回一个文本文件的值。
如何将文本文件的值存储到变量中?
解决方案
fs.readFile
不返回承诺,即使返回,您也不会返回它,这body
就是未定义的原因。而且您将回调与承诺混合在一起。要么下降isCompleted
要么await
。
要使用它,await
您可以使用util.promisify
将基于回调的函数转换为基于承诺的函数。
const { promisify } = require('util');
const readFIle = promisify(fs.readFile);
function readFileBody() {
return readFile(files[1], 'utf8');
// ^^ you need to return the promise
}
async function printFiles () {
body = await readFileBody();
}
在节点 >= 10 中,您可以使用fs/promises
来避免promisify
const fs = require('fs').promises;
function readFileBody() {
return fs.readFile(files[1], 'utf8');
}
推荐阅读
- php - 不能将字符串偏移量用作 addressfield_widget_process() 中的数组
- python - 为什么在新测试图像上运行良好的卷积神经网络模型在视频流上失败?
- python - Anaconda 的最佳实践是设置需要在 Anaconda 找到的财务功能的 python 环境的方式吗?
- java - 如何在 Linux 中提高 Java SOAP Web 服务客户端性能
- rabbitmq - 设置消息之间的最小延迟 - rabbitmq
- javascript - Nodejs如何决定首先执行哪个函数?
- npm - 为什么这个 gulp 脚本在 v4.0.0-alpha.2 和 v4.0.2 之间表现不同?
- http - 大文件上传时 TidHTTPServer “内存不足”
- reason - 此表达式具有类型...但表达式应为类型
- c# - 如何修复“当前线程与渲染器的同步上下文无关”?