gpt4 book ai didi

javascript - 在 JavaScript 中使用递归函数时如何处理 promise

转载 作者:搜寻专家 更新时间:2023-10-31 23:03:10 24 4
gpt4 key购买 nike

我想递归地记录目录中的所有文件,并在记录所有文件时返回确认。这是目录结构。


样本
│ 应用程序.js
└────温度1
│ │ temp1.js
│ └────温度2
│ │ temp2.​​js

这是代码

```

let readDirectory = function(dirname){
return new Promise((resolve,reject)=>{
fs.readdir(dirname,(err,files)=>{
if(err) reject(err);
files.forEach(file=>{
fs.stat(`${dirname}/${file}`,(err,stats)=>{
if(stats.isDirectory()){
readDirectory(`${dirname}/${file}`)
}else{
resolve(console.log(file));
}
})
})
})
})
}



readDirectory(sampledir).then(()=>console.log('completed'));

```

下面是我执行这个函数的结果。

```

app.js
completed
temp1.js
temp2.js

```

我应该在哪里解决以获得如下输出。

```

app.js
temp1.js
temp2.js
completed

```

最佳答案

只有在Promise.all 解析每个 文件后,您才需要解析。此外,您需要在目录中的每个文件完成后才需要解析每个目录 promise :

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

关于javascript - 在 JavaScript 中使用递归函数时如何处理 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50314356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com