gpt4 book ai didi

javascript - 在递归遍历目录时等待所有 promise 都已解决

转载 作者:行者123 更新时间:2023-11-29 19:03:27 25 4
gpt4 key购买 nike

我正在尝试递归遍历目录树并收集所有文件名。然而,在下面的代码中,最后的 console.log() 运行得太早,没有等待函数的递归 cacheDir 调用生成的 promise 来解决:

function cacheDir(dir) {
return fs.readdir(dir).then(items => {
const readDirPromises = []

for (let item of items) {
const fullPath = path.join(dir, item)
const lstat = fs.lstat(fullPath)
readDirPromises.push(lstat)

lstat.then(stats => {
if (stats.isFile()) {
return fullPath
} else {
return cacheDir(fullPath)
}
})
}

return Promise.all(readDirPromises)
})
}

cacheDir("../someDir/")
.then(results => console.log('done!', results))

我做错了什么?在我看来,readDirPromises 将是一个 strings 和 promises 数组,其中的每个 promise 本身都会解析为一个字符串和 promises 数组。

最佳答案

您使用 Promise.all() 等待的 promise 需要是 lstat.then(),而不仅仅是 lstat。请记住,lstat.then() 返回一个新的 promise ,并且该新 promise 跟踪从 .then() 处理程序中返回的任何 promise ,这是您递归所需的。

这是一个版本(并删除了一些临时变量):

function cacheDir(dir) {
return fs.readdir(dir).then(items => {
const readDirPromises = [];

for (let item of items) {
const fullPath = path.join(dir, item);

readDirPromises.push(fs.lstat(fullPath).then(stats => {
if (stats.isFile()) {
return fullPath;
} else {
return cacheDir(fullPath);
}
}));
}

return Promise.all(readDirPromises)
})
}

关于javascript - 在递归遍历目录时等待所有 promise 都已解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44988707/

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