コードに間違いが多数あります。部分的なリスト:
.concat()
のでそれだけでlist.concat(result)
が実際に何もしない、新しい配列を返します。
resolve()
を同期して呼び出し、すべての非同期操作が完了するのを待っていません。
いくつかのネストされた非同期コールバックの深い部分から再帰的に戻ろうとしています。あなたはそれをすることはできません。結果はどこにも戻ってこない。
fs
モジュールの有名なバージョンを使用すると、このトンが使いやすくなります。私はそれを作成するために、ブルーバードを使用して、あなたはこれを行うことができます。
const path = require('path');
var Promise = require('bluebird');
const fs = Promise.promisifyAll(require('fs'));
function iterate(dir) {
return fs.readdirAsync(dir).map(function(file) {
file = path.resolve(dir, file);
return fs.statAsync(file).then(function(stat) {
if (stat.isDirectory()) {
return iterate(file);
} else {
return file;
}
})
}).then(function(results) {
// flatten the array of arrays
return Array.prototype.concat.apply([], results);
});
}
注:私はそれがより一般的に便利ですので、ちょうど最初のパスを取るためにiterate()
を変更しました。あなたは最初にbody.path
を渡すことができます。
const path = require('path');
const fs = require('fs');
fs.readdirAsync = function(dir) {
return new Promise(function(resolve, reject) {
fs.readdir(dir, function(err, list) {
if (err) {
reject(err);
} else {
resolve(list);
}
});
});
}
fs.statAsync = function(file) {
return new Promise(function(resolve, reject) {
fs.stat(file, function(err, stat) {
if (err) {
reject(err);
} else {
resolve(stat);
}
});
});
}
function iterate2(dir) {
return fs.readdirAsync(dir).then(function(list) {
return Promise.all(list.map(function(file) {
file = path.resolve(dir, file);
return fs.statAsync(file).then(function(stat) {
if (stat.isDirectory()) {
return iterate2(file);
} else {
return file;
}
});
}));
}).then(function(results) {
// flatten the array of arrays
return Array.prototype.concat.apply([], results);
});
}
iterate2(".").then(function(results) {
console.log(results);
});
ここでカスタマイズ可能なフィルタ機能を追加したバージョンがあります:
function iterate2(dir, filterFn) {
// default filter function accepts all files
filterFn = filterFn || function() {return true;}
return fs.readdirAsync(dir).then(function(list) {
return Promise.all(list.map(function(file) {
file = path.resolve(dir, file);
return fs.statAsync(file).then(function(stat) {
if (stat.isDirectory()) {
return iterate2(file, filterFn);
} else {
return filterFn(file)? file : "";
}
});
})).then(function(results) {
return results.filter(function(f) {
return !!f;
});
});
}).then(function(results) {
// flatten the array of arrays
return Array.prototype.concat.apply([], results);
});
}
// example usage
iterate2(".", function(f) {
// filter out
return !(/(^|\/)\.[^\/\.]/g).test(f);
}).then(function(results) {
console.log(results);
});
http://stackoverflow.com/questionsここ
は、一般的なES6を使用したバージョンは約束です/ 29020722/recursive-promise-in-javascriptを読んで、 "return"を修正してください –
あなたの関数の目標は何ですか?あなたは最終的に何を得ようとしていますか?完全なパスとディレクトリがないすべてのファイルの再帰的なリスト? – jfriend00
@ jfriend00ディレクトリ内のファイルのリストとそのすべてのサブディレクトリを含む配列。配列は単一次元です。 – user2727195