javascript - 等待递归 readdir 函数结束

标签 javascript node.js recursion promise bluebird

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

假设你的 db 库返回了 promises 而你想等待插入,你会这样做

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);
            }
        });
    });
}

关于javascript - 等待递归 readdir 函数结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30264626/

相关文章:

javascript - Highcharts (Highstock) : Get data from external CSV, 无法正确显示日期

javascript - 一个按钮中有两个onClick函数,并且想要一个接一个地发生单击函数

node.js - ejs 模板无法正确渲染

node.js - Mongoose 实例方法丢失执行上下文

JavaScript 异步循环

javascript - 主干/下划线 js "too much recursion"和 "Inspect target crashed"错误

javascript - 如何循环表行并获取列复选框

mysql时间戳格式的Javascript正则表达式不起作用

javascript - 如何在 app.get() 中将 $and 值从 getcondition 返回到 options.where?

java - 带递归排序的 StackOverFlowError