等待递归readdir函数的结束

时间:2015-05-15 16:39:36

标签: javascript node.js recursion promise bluebird

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

                }
            });
        });
    });
}

1 个答案:

答案 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');
}