当我调用此代码(尝试将目录中的文件读入 filename: content 数组)时,它不会在 readFiles() 调用中运行 console.log(data) 。如果我使用 readFile,它会按预期工作,但由于同步执行需要,在调用之外使用时不会产生数据。
function readFiles(parameters) {
var dirname = parameters.dirname;
var onFileContent = parameters.onFileContent;
var onError = parameters.onError;
fs.readdir(dirname, (err, filenames)=>{
if (err) {
onError(err);
return;
}
filenames.forEach(filename => {
return fs.readFileSync(path.resolve(dirname, filename), 'utf-8', {stdio: [0, 1, 2]}, (err, content)=>{
if (err) {
onError(err);
return;
}
onFileContent(filename, content);
});
});
});
};
readFiles({
dirname: path.join(__dirname, '../ping/'), onFileContent: (filename, content) => {
data[filename] = content;
//console.log(content);
//global.data2 = data;
console.log(data);
}, onError: function (error) {
console.log(error);
}
});
console.log(data);
使用同步变体时,我只是看到 {},但异步会产生:
{ test_node: '{"changed": false, "ping": "pong"}' }
{ test_node: '{"changed": false, "ping": "pong"}', test_node_2: '{"changed": false, "ping": "pong"}' }
我知道我需要使用同步变体,但我不明白为什么它不能像我预期的那样工作。
最佳答案
这是我认为您正在寻找的完全同步版本:
var fs = require('fs');
var path = require('path');
function readFiles(dir) {
var files = {};
fs.readdirSync(dir)
.forEach(name => {
if (fs.statSync(path.join(dir, name)).isDirectory()) return;
files[name] = fs.readFileSync(path.join(dir, name), 'utf8');
});
return files;
}
var files = readFiles('/some/folder');
console.log(files);
关于node.js - 为什么在不使用 readFile 的 Sync 变体时该函数能够正确返回数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39777504/