定义
File#createDirectoriesFromJSON (json, cb);
json:JSON 对象。
CB:功能。参数:error(错误)、created(布尔值,如果至少创建了一个目录则为真)。
假设 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”也是一样的。