私はこの非同期再帰関数を使用してディレクトリのファイルとフォルダを繰り返し処理しています.cssファイルが見つかったら、 'common.css'というファイルにデータを追加します。データをファイルに非同期で追加する
var walk = function(dir, done) {
var results = [];
fs.readdir(dir, function(err, list) {
if (err) return done(err);
var pending = list.length;
if (!pending) return done(null);
list.forEach(function(file) {
file = dir + '/' + file;
fs.stat(file, function(err, stat) {
if (stat && stat.isDirectory()) {
minimizer(file, function(err, res) {
results = results.concat(res);
if (!--pending) done(null);
});
} else if(file) {
fs.open('common.css', 'a', 666, function(err, id) {
fs.write(id, 'hello', null, 'utf8', function(){
fs.close(id, function(){
console.log('file closed');
});
});
});
}
if (!--pending) done(null);
});
});
}); }
問題がasyncronousされ、私は機能の複数のインスタンスが同時にファイルに書いている時間があることを感知し、ということです。このフラックスを制御して書き込みタスクをキューイングできる方法はありますか?
このコードの目的は、ディレクトリにある.cssファイルをマージすることです。このプロジェクトでは外部ツールを使用できません。
EDIT ANSWER:この目的のために、私はマージしたいすべての.cssファイルのパスを収集し、それらをすべて持ってからシンクロナス関数を呼び出して書き込みます。
VAR結果= []
がそこにあるものです。私はそれを実現しました。
の例では、ディレクトリ内のすべてのファイルのcommon.cssでハローをopenningと足すいます3つのファイルがある場合は、 "hellohellohello"と書きます。これはあなたの本当のコードですか?この目的のためには、ファイルの数を取得してから、「hello」をN回だけ開いて書き込むことができます。 –