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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:15:03