You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归函数中使用Promise检测可用文件名无法正常resolve问题

问题根因

递归调用checkFileName(n)时,仅执行了递归函数,没有将内层递归返回的Promise结果和外层Promise关联。当文件存在时,最外层调用返回的Promise始终处于pending状态,没有触发resolve或reject,自然无法拿到返回结果。

修复代码

只需要在递归调用时,将内层Promise的结果通过外层的resolve透传即可:

const fs = require('fs')
function checkFileName(n = 0) {
    return new Promise((resolve, reject) => {
        fs.open(`./npm${n}.txt`, 'r', function(err, res) {
            if (err) {
                resolve(`./npm${n}.txt`)
            } else {
                // 透传内层递归的Promise结果
                resolve(checkFileName(n + 1))
            }
        })
    })
}
checkFileName().then(name => {
    console.log(name)
})

优化建议

  • 可以用fs.access替代fs.open做存在性校验,语义更贴合,也不会额外占用文件描述符
  • 如果预期同目录下连续序号的文件数量很多,建议改成循环实现,避免递归深度过高导致调用栈溢出

内容的提问来源于stack exchange,提问作者JSX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:48:03