var content;
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
console.log(content);
日志未定义,为什么?
var content;
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
console.log(content);
日志未定义,为什么?
当前回答
下面是函数将工作异步包装或承诺然后链
const readFileAsync = async (path) => fs.readFileSync(path, 'utf8');
其他回答
使用内置的promisify库(Node 8+)使这些旧的回调函数更加优雅。
const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
async function doStuff() {
try {
const content = await readFile(filePath, 'utf8');
console.log(content);
} catch (e) {
console.error(e);
}
}
var data = fs.readFileSync('tmp/reltioconfig.json','utf8');
使用这个来同步调用一个文件, 不进行编码,将输出显示为缓冲区。
如前所述,fs。readFile是一个异步动作。这意味着当您告诉节点读取一个文件时,您需要考虑这将花费一些时间,同时,节点继续运行以下代码。在你的例子中,它是:console.log(content);。
这就像把代码的一部分发送到很远的地方(比如读取一个大文件)。
看看我写的评论:
var content;
// node, go fetch this file. when you come back, please run this "read" callback function
fs.readFile('./Index.html', function read(err, data) {
if (err) {
throw err;
}
content = data;
});
// in the meantime, please continue and run this console.log
console.log(content);
这就是为什么当您记录内容时,内容仍然是空的。Node尚未检索到文件的内容。
这可以通过在回调函数中移动console.log(content)来解决,就在content = data;之后。这样,您将在节点读取文件以及内容获得值之后看到日志。
同步和异步文件读取方式:
//fs module to read file in sync and async way
var fs = require('fs'),
filePath = './sample_files/sample_css.css';
// this for async way
/*fs.readFile(filePath, 'utf8', function (err, data) {
if (err) throw err;
console.log(data);
});*/
//this is sync way
var css = fs.readFileSync(filePath, 'utf8');
console.log(css);
节点欺骗可在read_file。
在ES7中使用Promises
与mz/fs异步使用
mz模块提供了核心节点库的承诺版本。使用它们很简单。首先安装库…
npm install mz
然后……
const fs = require('mz/fs');
fs.readFile('./Index.html').then(contents => console.log(contents))
.catch(err => console.error(err));
或者你也可以在异步函数中写它们:
async function myReadfile () {
try {
const file = await fs.readFile('./Index.html');
}
catch (err) { console.error( err ) }
};