异步/等待函数,fs.readfile并将其存储到变量[duplicate]

问题描述 投票:1回答:1

这个问题在这里已有答案:

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文件的值。

如何将文本文件的值存储到变量中?

javascript node.js async-await fs
1个回答
5
投票

fs.readFile没有回复承诺,即使它做了,你也没有回复它,这就是为什么body未定义。而你正在将回调与承诺混合在一起。要么放下isCompletedawait

要与await一起使用,您可以使用util.promisify将基于回调的函数转换为基于promise的函数。

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');
}
© www.soinside.com 2019 - 2024. All rights reserved.