asynchronous任务完成后写入文件

我编写了下面的代码来创buildKEYS设置为注释标题的对象和VALUES设置为共享这些标题的文件。 如果没有标题,文件名将被写入文件。 我想写这个头对象到文件,但它是在对象完成之前写入的。 我明白为什么会发生这种情况,但我似乎无法解决这个问题。 以下是将对象写入文件的代码:

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

它仍然需要进一步的重构,但应该给你的想法:

 function processDir(dir, callback) { dive(dir, {all: false}, function (err, file) { if (err) { return callback(err); } fs.readFile(file, 'utf8', callback); }); } fs.readFile(cpFile, 'utf8', function(err, copyRight) { if (err) return console.error(err); subdirs(__dirname, 1, function (err, dirs) { if (err) return console.error(err); async.each(dirs, function (dir, next) { if (!dir.match(/.*\/src$/)) return next(); processDir(dir, function(err, data) { if (err) return next(err); if (!data.match(re)) { return fs.appendFile(noCopy, file + "\n", next); } top = data.match(re); if (allHeaders[top[0]]) { allHeaders[top[0]].push(file); } else { allHeaders[top[0]] = [file]; } return next(); }); }, function (err) { if (err) return console.error(err); stringObj = JSON.stringify(allHeaders, null, 4); fs.writeFile(currentHeads, stringObj, function(err) { if (err) return console.error(err); console.log('Complete!'); }); }); }); }); 

我认为问题在于,在同步(dirs.forEach)内部使用asynchronous函数(dive),而在代码中的下一个函数(将所有头文件写入文件)在先执行,所有指令都被实际处理。

要解决这个问题,你可以使用“asynchronous”模块,例如:

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