0

ノードを使用してサブディレクトリを含むディレクトリに含まれる一意のファイル名のリストを取得したいと考えていましたが、各コールバックの結果を組み合わせるのに問題がありました。コールバックからファイル名をログに記録するだけで発生する重複操作を避けたいと思っていfs.statます。

var distinct = {};

function getNames(root) {
    fs.readdir(root, function(err, list) {
        list.forEach(function(file) {
            file = root + '/' + file; 
            fs.stat(file, function(err, stat) {
                if (!err && stat.isDirectory()) {
                    getNames(file);
                } else {
                    distinct[path.basename(file)] = true;
                }
            });
        });
    });
}

// perform various operations on unique filename list
console.log(Object.keys(distinct));

もちろん、これはconsole.log()関数の呼び出しが早すぎて、望ましくない結果をもたらします。作業する一連のファイル名を取得するにはどうすればよいですか。readdirSync非同期メソッドを使用して、つまりandを使用せずにこれを行う良い方法はありstatSyncますか?

4

2 に答える 2

1

promiseを使用することをお勧めしますか?

function getNames(root) {
    readdir = Q.nfbind(fs.readdir);
    stat = Q.nfbind(fs.stat);
    return readdir(root)
        .then(function(list) {
            files = [];
            for(var i = 0; i < list.length; i++) {
                file = root + '/' + list[i]; 
                files.push(stat(file)
                    .then(function(stat) {
                        if (stat.isDirectory()) {
                            return getNames(file);
                        } else {
                            return path.basename(file);
                        }
                     })
                );
            }
            return Q.all(files);
        });
}
getNames('someDir')
    .then(console.log)
    .catch(console.error);
于 2014-09-05T20:39:04.693 に答える