等待递归 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);
            }
        });
    });
}