【问题标题】:How to correctly manipulate and return an array of files with node?如何正确操作并返回带有节点的文件数组?
【发布时间】:2020-09-09 15:28:29
【问题描述】:

给定一个包含降价文件的目录,即

myDir
|- fileA.md
|- fileB.md
|- fileC.md
|- fileD.md

我正在尝试通过删除文件扩展名来创建这些文件的数组。

我正在尝试这个:

var mdFiles = fs.readdir('myDir', (err, files) => {

    const filesNoExt = []

    files.forEach( file => {      
        filesNoExt.push(file.slice(0, -3)
    })
    return filesNoExt
});

console.log(mdFiles)

但是console.log 命令的结果是undefined

如果我像这样修改此脚本(因此,通过在 readdir 函数中添加 console.log):

var mdFiles = fs.readdir('myDir', (err, files) => {

    const filesNoExt = []

    files.forEach( file => {      
        filesNoExt.push(file.slice(0, -3)
    })
    console.log(filesNoExt)
});

console.log(mdFiles)

这是我得到的:

undefined
[
  'fileA',
  'fileB',
  'fileC',
  'fileD'
]

第一行是undefined,和之前一模一样,但它也打印了函数内部console.log的结果,这表明filesNoExt数组正确地填充了剥离的文件名。

如何正确地从mdFiles 函数返回filesNoExt 数组,以便我也可以从外部访问其内容?

【问题讨论】:

    标签: javascript node.js fs


    【解决方案1】:

    它不起作用的原因是因为readdir 是一个异步函数,这意味着它与您的其余代码并行运行。如果要阻止执行,请使用readdirSync

    var mdFiles = fs.readdirSync('myDir');
    const filesNoExt = [];
    mdFiles.forEach(file => {      
        filesNoExt.push(file.slice(0, -3)
    });
    console.log(filesNoExt);
    

    【讨论】:

      【解决方案2】:

      您传递给fs.readdir 的回调是异步发生的(在调用堆栈清空之后),因此您无法像这样获得它的返回值。实际上,返回值被忽略了。你可以使用这个:

      fs.readdir('myDir', (err, files) => {
          const filesNoExt = [];
      
          files.forEach( file => {      
              filesNoExt.push(file.slice(0, -3)
          });
      
          console.log(mdFiles)
      });
      

      或者你可以使用这样的承诺:

      (async ()=>{
      
        const mdFiles = await fs.promises.readdir('myDir');
      
        files.forEach( file => {      
          filesNoExt.push(file.slice(0, -3)
        });
      
        console.log(mdFiles);
      })();
      

      如果您正在执行其他异步操作(例如使用setTimeout),您应该使用fs 函数的同步变体(例如fs.readdirSync),因为它们会阻塞程序(主线程)同时执行动作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-06
        • 1970-01-01
        • 1970-01-01
        • 2021-01-07
        • 2020-08-26
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多