我编写了以下代码来创建一个对象,其中 KEYS 设置为注释标题,VALUES 设置为共享这些标题的文件。如果没有 header ,文件名将写入文件。我想将此 header 对象写入文件,但它是在对象完成之前写入的。我明白为什么会这样,但我似乎无法解决这个问题。下面是将对象写入文件的代码:
stringObj = JSON.stringify(allHeaders, null, 4);
fs.writeFile(currentHeads, stringObj, function(err) {
if (err) {
console.log(err);
}
});
console.log('Complete!');
这是脚本的其余部分:
"use strict";
var fs = require('fs'),
dive = require('dive'),
subdirs = require('subdirs'),
cpFile = __dirname + "/" + "header.txt",
noCopy = __dirname + "/" + "noCopyright.txt",
currentHeads = __dirname + "/" + "currentHeaders.txt",
re = /(\/\*(?:(?!\*\/).|[\n\r])*\*\/)/, // matches first multi-line comment
walkDir,
allHeaders = {},
stringObj,
top;
fs.readFile(cpFile, 'utf8', function(err, copyRight) {
subdirs(__dirname, 1, function(err, dirs) {
if (err) {
return console.log(err);
}
dirs.forEach(function(dir) {
if (dir.match(/.*\/src$/)) {
dive(dir, { all: false }, function(err, file) {
if (err) {
return console.log(err);
}
fs.readFile(file, 'utf8', function(err, data) {
if (err) {
return console.log(err);
}
if (data.match(re)) {
top = data.match(re);
if (allHeaders[top[0]]) {
allHeaders[top[0]].push(file);
} else {
allHeaders[top[0]] = [file];
}
} else {
fs.appendFile(noCopy, file + "\n", function(err) {
if (err) {
return console.log(err);
}
});
}
});
});
}
});
});
});
最佳答案
我认为问题在于您在同步 (dirs.forEach) 中使用了异步函数 (dive),并且您代码中的下一个函数(将 allHeaders 写入文件)执行得更早,然后所有指令才被实际处理。
要解决此问题,您可以使用“async”模块,例如:
async.each(dirs, function(dir, next) {
// process dir here, in case of error call return next(err), otherwise call return next();
}, function(err) {
// process err somehow
// if there is no error, all directives are processed, write allHeaders to file
stringObj = JSON.stringify(allHeaders, null, 4);
fs.writeFile(currentHeads, stringObj, function(err) {
if (err) {
console.log(err);
}
console.log('Complete!');
});
});
关于javascript - 异步任务完成后写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33311522/