递归函数中使用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
相关产品推荐
相关产品推荐

