gpt4 book ai didi

node.js - 使用 Promise 递归列出目录中的所有文件,而不使用 fs.promises api

转载 作者:太空宇宙 更新时间:2023-11-04 01:18:48 24 4
gpt4 key购买 nike

我的目的是创建一个可以递归列出目录中文件的脚本。我正在使用 promise 来解决这个问题。我使用的代码如下。

var fs = require("fs")
var path = require("path")

function walk(dpath){
return new Promise(function(resolve, reject){
fs.readdir(dpath, function(err, contents){
if(err){
reject(err)
}
else{
Promise.all(contents.map(function(cont){
return new Promise(function(res, rej){
var fpath = path.join(dpath, cont)
fs.lstat(fpath, function(e, s){
if(e){
rej(e)
}
else{
if(s.isFile()){
res(fpath)
}
else if(s.isDirectory()){
walk(fpath).then(res)
}
}
})
})
})).then(function(resa){
resolve(resa.reduce((all, resa) => all.concat(resa), []));
})
}
})
})
}

walk("/home/oem/Downloads").then(console.log)

  1. 此脚本运行但不打印结果。但是当我用 console.log 替换 reduce 函数时,我确实得到了输出。请帮助我理解这种行为,以及如何将 Promise.all 的结果传递给被调用者?

  2. 由于在 Node.js 中使用同步操作是不受欢迎的,因此如果我在这种情况下使用 fs.lstatSync() 可以吗?对性能有何影响?

<小时/>

谢谢,祝你有美好的一天。 :)

最佳答案

很难判断您的代码发生了什么,但我尝试稍微重写一下,也许这会有所帮助:

const fs = require('fs')
const path = require('path')

function walk(dirpath) {
return new Promise((resolve, reject) => {
fs.readdir(dirpath, (err, contents) => {
if (err) return reject(err)

Promise.all(
contents.map(fileOrDirectory => {
return new Promise((resolve, reject) => {
const statPath = path.join(dirpath, fileOrDirectory)
fs.lstat(statPath, (err, stat) => {
if (err) return reject(err)

if (stat.isDirectory()) return walk(statPath).then(resolve)

resolve([statPath])
})
})
})
)
.then(results => {
return results.reduce((all, x) => all.concat(...x), [])
})
.then(resolve)
.catch(reject)
})
})
}

walk(path.resolve('.'))
.then(console.log)
.catch(console.error)

我注意到的一件事是,你的返回类型根据你是否递归而不同。如果 stat 是一个文件,您应该将其包装在一个数组中,以便获得与 walk(stat).then(thisIsAnArray => resolve(thisIsAnArray)) 相同的返回类型。我能看到的唯一的其他区别是我使用“扩展”运算符来展平数组。

简而言之,我认为您很好地掌握了代码中实际的“Promise”部分,收集所有结果时只有一些微妙之处。

关于node.js - 使用 Promise 递归列出目录中的所有文件,而不使用 fs.promises api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60008583/

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