意味
File#createDirectoriesFromJSON (json, cb);
json:JSONオブジェクト。
cb:関数。パラメータ:error(Error)、created(ブール値、少なくとも1つのディレクトリが作成されている場合はtrue)。
Fileクラスに_path
、ディレクトリのパスを含むという名前のプロパティが含まれているとします。
利用方法
var json = {
b: {
c: {
d: {},
e: {}
},
f: {}
},
g: {
h: {}
}
};
//this._path = "."
new File (".").createDirectoriesFromJSON (json, function (error, created){
console.log (created); //Prints: true
//callback binded to the File instance (to "this"). Hint: cb = cb.bind (this)
this.createDirectoriesFromJSON (json, function (error, created){
console.log (created); //Prints: false (no directory has been created)
});
});
結果
下 "。" jsonオブジェクトに表示されるディレクトリツリーが作成されました。
./b/c/d
./b/c/e
./b/f
./b/g/h
実装
これは私がasync.jsなしで持っているものです:
File.prototype.createDirectoriesFromJSON = function (json, cb){
cb = cb.bind (this);
var created = false;
var exit = false;
var mkdir = function (path, currentJson, callback){
var keys = Object.keys (currentJson);
var len = keys.length;
var done = 0;
if (len === 0) return callback (null);
for (var i=0; i<len; i++){
(function (key, i){
var dir = PATH.join (path, key);
FS.mkdir (dir, function (mkdirError){
exit = len - 1 === i;
if (mkdirError && mkdirError.code !== "EEXIST"){
callback (mkdirError);
return;
}else if (!mkdirError){
created = true;
}
mkdir (dir, currentJson[key], function (error){
if (error) return callback (error);
done++;
if (done === len){
callback (null);
}
});
});
})(keys[i], i);
}
};
var errors = [];
mkdir (this._path, json, function (error){
if (error) errors.push (error);
if (exit){
errors = errors.length === 0 ? null : errors;
cb (errors, errors ? false : created);
}
});
};
好奇心のために、async.jsを使用して関数を書き直したいと思います。ここでの問題は、関数が再帰的で並列であるということです。たとえば、「b」フォルダは「g」と並行して作成されます。「b/c」と「b/f」、「b / c/d」と「b/c/e」も同様です。