Javascript 正在等待递归readdir函数的结束
我使用递归readdir读取目录的整个文件树,将其放入数据库 我的问题是,当数据库的整个readdir/insert尚未完成时,我试图停止下一行代码 我在promises中寻找解决方案,但在我的函数的第一次调用时(因此在树的第一个文件夹中),承诺就实现了 有什么想法吗Javascript 正在等待递归readdir函数的结束,javascript,node.js,recursion,promise,bluebird,Javascript,Node.js,Recursion,Promise,Bluebird,我使用递归readdir读取目录的整个文件树,将其放入数据库 我的问题是,当数据库的整个readdir/insert尚未完成时,我试图停止下一行代码 我在promises中寻找解决方案,但在我的函数的第一次调用时(因此在树的第一个文件夹中),承诺就实现了 有什么想法吗 function readsousdir(path, db, db2) { var Datastore = require('nedb'); var fs = require('fs'); fs.readd
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);
}
});
});
});
}
使用蓝鸟,您可以使用: 假设您的db库返回承诺,并且您希望等待插入,您可以这样做
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
对象来自什么类型的对象?它是一个nedb数据存储:您使用的promise库是什么?我可以使用Q或bluebird,作为您使用bluebird的示例,我也将使用它。你们都他妈的快!(比我更重要的是,我试图理解你所有的答案)。非常感谢您的帮助。如果您使用的是Bluebird,为什么不使用回调函数来提示fs.readdir()。这应该是异步的。我知道这不是问题的一部分,但我怀疑db.insert(doc)
和db2.insert(doc)可能需要适当的错误处理,这肯定会增加完整解决方案的复杂性。@ JFrADO00我没有立即注意到STAT的调用,所以我在中间改变了策略……未处理的拒绝错误:ENONOTE:没有这样的文件或目录,STAT'D:\EcOut\\“未定义”的错误(原生),似乎它丢失了“file”(未定义)在第一个循环中,错误的javascript文件是:bluebird\js\main\captured\u trace.js:478
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);
}
});
});
}