JavaScript Promise返回空数组问题:createFolder()无法正常返回project_array内容
问题原因
你现在的代码里createFolder返回空数组的核心问题是循环内的fs.readdir是异步回调操作,你没有等待所有异步读取操作完成就提前执行了resolve(project_array),此时数组还没被任何回调插入内容,自然是空的。
修复方案
推荐直接用Node.js内置的fs.promises接口替代回调式API,配合Promise.all等待所有目录读取操作完成后再返回结果:
const fs = require('fs').promises; // 改用promise版本的fs接口 function get_project_folders(){ return fs.readdir(__dirname + '/projects') .catch(error => { console.log(`Error. Unable to read directory - ${error}`) throw error }) } async function createFolder(){ let list_of_projects = await get_project_folders() // 把每个项目的读取操作都包装成promise,放到数组里 const projectPromises = list_of_projects.map(async project => { let splitProject = project.split("-") const dirPath = __dirname + `/projects/${splitProject[0]}-${splitProject[1]}` try { const data1 = await fs.readdir(dirPath) return {circuit: splitProject[0], fuse: splitProject[1], pole: data1} } catch (error) { console.log('Error. Unable to read directory: ' + dirPath) return null // 出错的条目可以自行决定是过滤还是抛错终止 } }) // 等待所有异步操作完成,过滤掉出错的null值后返回 const project_array = (await Promise.all(projectPromises)).filter(Boolean) return project_array } async function testIt(){ let folderData = await createFolder() console.log(folderData) } testIt()
主要修改说明
- 弃用回调形式的fs API,改用官方内置的promise版本,适配async/await语法,避免回调嵌套
- 用
Array.map把每个项目的读取操作都转为独立的promise,统一通过Promise.all等待所有操作执行完成 - 优化错误处理逻辑,同时支持过滤读取失败的条目,也可以根据需求修改为出错就终止全部流程
内容的提问来源于stack exchange,提问作者night_programmer
相关产品推荐
相关产品推荐

