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)时(不返回),它也会返回一个undefined,但是我在本地isCompleted中调用console.log(text),它将返回一个text文件的值。
如何将文本文件的值存储到变量?
答案 0 :(得分:5)
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');
}