Необходимо разрешить только после Promise.all
разрешения по каждому файлу.Кроме того, вам нужно разрешать каждое обещание каталога только после того, как каждый файл в каталоге завершен:
let readDirectory = function(dirname) {
return new Promise((resolveAll, rejectAll) => {
fs.readdir(dirname, (err, files) => {
if (err) rejectAll(err);
})
}).then((files) => {
const filesPromises = files.map(file => (
new Promise((resolveFile, rejectFile) => {
fs.stat(`${dirname}/${file}`, (err, stats) => {
if (err) rejectFile(err);
if (stats.isDirectory()) {
readDirectory(`${dirname}/${file}`)
.then(resolveFile);
.catch(rejectFile);
} else {
resolveFile(console.log(file));
}
})
})
));
return Promise.all(filesPromises).then(resolveAll);
});
}
Обратите внимание, что довольно сложно понять - вы будете далеколучше использовать async
/ await
, что-то вроде этого:
let readDirectory = async function(dirname) {
const files = await new Promise((resolve, reject) => {
fs.readdir(dirname, (err, files) => {
if (err) reject(err);
resolve(files);
});
});
const filesPromises = files.map(async (file) => {
const stats = await new Promise((resolve, reject) => {
fs.stat(`${dirname}/${file}`, (err, stats) => {
if (err) reject (err);
else resolve(stats);
});
});
if (stats.isDirectory()) await readDirectory(`${dirname}/${file}`);
else console.log(file);
});
return Promise.all(filesPromises);
}