Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正在等待递归readdir函数的结束_Javascript_Node.js_Recursion_Promise_Bluebird - Fatal编程技术网

Javascript 正在等待递归readdir函数的结束

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

我使用递归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);

                }
            });
        });
    });
}

使用蓝鸟,您可以使用:

假设您的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);
            }
        });
    });
}