【问题标题】:Promise JavaScript Returning Empty ArrayPromise JavaScript 返回空数组
【发布时间】:2021-12-16 05:24:35
【问题描述】:

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()

【问题讨论】:

  • 你看到get_project_folders返回什么了吗?
  • 是的,它会根据需要返回文件夹名称。创建文件夹函数是唯一不返回我需要的数据的函数
  • 这是一个异步问题 - 您的最后一次解决发生在您的 fs 调用解决之前。你应该做类似await Promise.all( list_of_projects.map(...) ) 的事情,然后解决你的包装承诺。

标签: javascript node.js asynchronous async-await promise


【解决方案1】:

这是一个经典,你正在做的是在你的节点 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),以便稍后将其过滤掉。

【讨论】:

  • 自己包装所有内容的替代方法是 const {promises: {readdir}} = require('fs') 或相同,但写得更长:const fs2 = require('fs'); const readdir = fs2.readdir;(当然也可以使用 import)然后使用只需使用 @ 987654329@。大多数 Node.js 内部库都有一个基于 Promise 的“官方”变体。
  • 当然可以,但目前不知道可能导致问题的节点版本。我的意思是我喜欢这种语法,但它在 nodejs 中还不是标准的:(
  • fs.promises 在 Node 10 中是稳定的,所以使用它已经安全了很长时间了。没有必要再害怕它了。 :-)
猜你喜欢
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
相关资源
最近更新 更多