我正在使用递归readdir来读取目录的整个文件树以将其放入数据库。
我的问题是我正在尝试停止下一行代码,而整个readdir / insert数据库没有完成。
我正在寻找promises中的解决方案但是在第一次调用我的函数时(所以在树的第一个文件夹中)承诺得以实现......
有什么想法吗?
function readsousdir(path, db, db2) {
var Datastore = require('nedb');
var fs = require('fs');
fs.readdir(path + '\\', function (err, files) {
files.forEach(function (file) {
fs.stat(path + '\\' + file, function (err, stats) {
var foldertrue = stats.isDirectory();
var filetrue = stats.isFile() == true;
if (foldertrue == true) {
var doc;
doc = folderdb(path + '\\' + file);
db2.insert(doc);
readsousdir(path + '\\' + file, db, db2);
}
if (filetrue) {
doc = pistedb(path + '\\' + file, []);
db.insert(doc);
}
});
});
});
}
答案 0 :(得分:4)
使用BlueBird,您可以使用reduce
:
function readsousdir(path, db, db2) {
var Datastore = require('nedb');
return fs.readdirAsync(path + '\\').reduce(function(_, file){
return fs.statAsync(path + '\\' + file)
.then(function(stats){
var foldertrue = stats.isDirectory();
var filetrue = stats.isFile() == true;
if (foldertrue == true) {
var doc;
doc = folderdb(path + '\\' + file);
return db2.insert(doc).then(function(){
return readsousdir(path + '\\' + file, db, db2)
});
}
if (filetrue) {
doc = pistedb(path + '\\' + file, []);
return db.insert(doc);
}
});
});
}
假设您的db库返回promise并且您想等待插入,那么您将执行
if(is_dir('folder')){
$foldername = '';
$counter = 2;
while (!$foldername) {
if (!is_dir("folder ({$counter})")) {
$foldername = "folder ({$counter})";
}
$counter++;
}
mkdir($foldername);
}else{
mkdir('folder');
}