【发布时间】:2015-07-18 10:52:28
【问题描述】:
场景
需要并行运行两个任务,在firstTask && secondTask完成后运行第三个任务。一直在使用async 库并且代码有效,但想知道我的代码是否有什么可以改进的地方。
详情
任务 1:readFileNames:读取一个文件夹并返回一个文件名数组。
任务 2:copyFile:将config 文件从 src 文件夹复制到目标文件夹。
任务 3:writeConfig:将readFileNames 的结果写入位于destination 文件夹的config 文件中。
问题
我应该将parallel 控制流与eachSync 结合起来吗?另外,想知道承诺是否会帮助我实现我想要做的事情?哪种方法在性能方面更好? Async vs Q 还是应该使用更抽象的库,例如 orchestrator?
以下是我目前所拥有的,它可以工作,但想知道是否有更好的方法:
代码
var async = require("async");
var fs = require("fs-extra");
var dir = require("node-dir");
var path = require("path");
var _ = require("underscore");
var readFileNames = function (src, cb) {
dir.files(src, function (err, files) {
if (err) { return cb(err); }
return cb(files);
});
};
var copyFile = function (src, dest, cb) {
fs.copy(src, dest, function (err) {
if (err) { return cb(err); }
return cb();
});
};
var writeConfig = function (destFile, content, cb) {
fs.appendFile(destFile, content, function (err) {
if (err) { return cb(err); }
return cb();
});
};
var modulesFolder = path.join(__dirname, "modules");
var srcFile = path.join(__dirname, "src", "config.json");
var destFile = path.join(__dirname, "dest", "config.json");
async.parallel(
[
function (callback) {
readFileNames(modulesFolder, function (files) {
callback(null, files);
});
},
function (callback) {
copyFile(srcFile, destFile, function () {
callback(null, "");
});
}
],
// last callback
function (err, results) {
var toWrite = _.flatten(results);
toWrite.forEach(function (content) {
if(content) {
writeConfig(destFile, content + "\n", function () {
});
}
});
console.log("done");
}
);
文件
├── dest
├── main.js
├── modules
│ ├── module1.txt
│ └── module2.txt
├── node_modules
│ ├── async
│ ├── fs-extra
│ └── node-dir
├── package.json
└── src
└── config.json
【问题讨论】:
-
更优雅究竟是什么意思?或者,“某种作品”,它要么有效,要么无效。如果它没有为您提供所需的输出,请向我们展示它为您提供的输出以及您想要的示例。
-
刚刚更新了问题。代码有效,但我想知道是否有一种模式可以做我想要实现的目标。我对节点模式没有太多经验,这就是我发布这个问题的原因。
-
我认为您没有理由使用 eachSync。但是,
async.eachSeries将适用于代替toWrite.forEach,因为writeConfig是异步的。
标签: javascript node.js async.js