等待递归 readdir 函数结束
Waiting for the end of a recursive readdir function
我正在使用递归 readdir 读取目录的整个文件树以将其放入数据库。
我的问题是我正在尝试停止下一行代码,而整个 readdir / 插入到数据库还没有完成。
我一直在寻找 promises 的解决方案,但在第一次调用我的函数时(所以在树的第一个文件夹中)promise 已经实现...
有什么想法吗?
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);
}
});
});
});
}
使用 BlueBird,您可以使用 reduce
:
var fs = Promise.promisifyAll(require("fs"));
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);
db2.insert(doc);
return readsousdir(path + '\' + file, db, db2)
}
if (filetrue) {
doc = pistedb(path + '\' + file, []);
db.insert(doc);
}
});
});
}
假设你的数据库库 returns 承诺并且你想等待插入,你会做
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);
}
});
});
}
我正在使用递归 readdir 读取目录的整个文件树以将其放入数据库。
我的问题是我正在尝试停止下一行代码,而整个 readdir / 插入到数据库还没有完成。
我一直在寻找 promises 的解决方案,但在第一次调用我的函数时(所以在树的第一个文件夹中)promise 已经实现...
有什么想法吗?
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);
}
});
});
});
}
使用 BlueBird,您可以使用 reduce
:
var fs = Promise.promisifyAll(require("fs"));
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);
db2.insert(doc);
return readsousdir(path + '\' + file, db, db2)
}
if (filetrue) {
doc = pistedb(path + '\' + file, []);
db.insert(doc);
}
});
});
}
假设你的数据库库 returns 承诺并且你想等待插入,你会做
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);
}
});
});
}