繁体   English   中英

Promise JavaScript 返回空数组

[英]Promise JavaScript Returning Empty Array

createFolder()函数返回一个空数组。 我不确定我做错了什么,但它需要返回project_array的项目

function get_project_folders(){

  return new Promise((resolve, reject)=>{
    fs.readdir(__dirname + '/projects', (error, data1)=>{
      if(error){
        reject(console.log(`Error. Unable to read directory - ${error}`))
      }else{
        resolve(data1)
      }
    })
  })
}
async function createFolder(){
  let list_of_projects = await get_project_folders()
  let project_array = []


  return new Promise((resolve, reject)=>{
    for(let project of list_of_projects){
      let splitProject = project.split("-")
      fs.readdir(__dirname + `/projects/${splitProject[0]}-${splitProject[1]}`, (error, data1)=>{
        if(error){
          console.log('Error. Unable to read directory.')
        }else{
          project_array.push({circuit: splitProject[0], fuse: splitProject[1], pole: data1})
        }
      })
    }
    resolve(project_array)
  })
}
async function testIt(){
  let folderData = await createFolder()
  console.log(folderData)
}

testIt()

这是一个经典,您正在做的是在您的节点 fs 异步方法解决之前使用空数组解决承诺。 试试这个:

 async function createFolder(){ const list_of_projects = await get_project_folders(); const result = await Promise.all( list_of_projects.map(project => new Promise((resolve, reject) => { const splitProject = project.split("-"); fs.readdir(__dirname + `/projects/${splitProject[0]}-${splitProject[1]}`, (error, data1) => { if(error){ console.error('Error. Unable to read directory.'); resolve( null ); } else { resolve({ circuit: splitProject[0], fuse: splitProject[1], pole: data1 }); } }); }); // Filter out the errors that resolved as `null` return result.filter( Boolean ); }

本质上,包装每个fs. 调用一个promise,然后使用Promise.all生成一个promise 数组。 因为Promise.all需要解决所有问题才能解决,所以请确保在出现错误时甚至解决 - 只需返回一些错误(在我的情况下为null ),以便稍后将其过滤掉。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM