异步任务完成后写入文件
Write to file after async tasks complete
我编写了以下代码来创建一个对象,其中KEYS设置为注释头,VALUES设置为共享这些头的文件。如果没有头文件,文件名将被写入文件。我想写这个头对象到文件,但它是在对象完成之前写的。我明白为什么会发生这种情况,但我似乎无法解决这个问题。下面是将对象写入file的代码:
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)和代码中的下一个函数(将allHeaders写入文件)中使用异步函数(dive),然后实际处理所有指令。
要解决这个问题,你可以使用'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!');
});
});
它仍然需要进一步重构,但应该给你一个想法:
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!');
});
});
});
});
相关文章:
- 吞噬任务多个和共享的 scss 文件
- 如何在Grunt.js中观察多个文件,但只在更改的文件上运行任务
- 如何在Gulp任务中拆分文件
- 从另一个grunt文件加载grunt任务
- 如何在gruntjs中使用watch将多个任务分配给多个文件
- 如何访问任务文件中的 Sails 配置变量
- 使用 gruntjs 自定义初始化任务重命名模板文件夹
- 正在新文件中创建自定义任务
- GulpJS任务在文件更改时自动缩小
- Grunt Copy任务不复制父文件夹's文件保存到正确的文件夹中
- Grunt:如何只对修改后的文件运行任务
- 运行“监视”任务 等待中..警告:EMFILE,打开的文件“./.”太多
- 在使用 GULP 任务将所有 JS 连接到单个 JS 文件中时,在 AngularJS 中出错
- 仅对 Gulp 任务中文件夹中的文件子集使用 Browserify
- 如何使 Gulp 任务将项目的每个 jsx 文件转换为不同的.js文件
- 如何将外部 JSON 数据从上一个任务中生成的文件传递到任务
- 如何在 Gulp 任务中间添加 CSS 文件.js
- 当没有等级库文件或等级库文件为空时,Grunt-contrib-jasmine 中止任务
- 我的 gulp usemin 任务缺少一个 js 文件
- 通过函数填充 Grunt 任务配置的“文件”属性