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

Posted

技术标签:

【中文标题】异步/等待函数,fs.readfile 并将其存储到变量 [重复]【英文标题】:Async/Await Function, fs.readfile and store it to a variable [duplicate] 【发布时间】:2018-11-03 17:43:39 【问题描述】:
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) 时,它会返回一个 undefined。 当我在本地 printFile 函数中 console.log(body) (不返回)时,它也会返回一个 undefined,但我在本地 isCompleted 中的 console.log(text) 时,它会返回一个文本文件的值。

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

【问题讨论】:

【参考方案1】:

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');

【讨论】:

以上是关于异步/等待函数,fs.readfile 并将其存储到变量 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使节点 fs 与类异步/等待?

模板引擎不关心内容之——art-template,碰见的同步与fs.readFile异步以及函数回调问题的描述,针对fs的readfille读取文件时,返回不了异步函数返回值的解决方法

node同步读取readFileSync和异步读取readFile的区别

Nodejs 处理异步(获取异步数据并处理)的方法

如何等待多个 fs.readFile 调用?

Node.js fs.readfile/异步文件访问:在回调中获取当前文件