gpt4 book ai didi

javascript - 在 .map() 中使用 fse.readFile()

转载 作者:搜寻专家 更新时间:2023-10-31 23:40:25 24 4
gpt4 key购买 nike

我正在尝试使用 promises 读取 Node.js 中多个文件的内容。由于标准的 fs 模块没有提供足够的 promise 接口(interface),我决定使用 fs-extra相反,它提供与默认 fs 模块几乎相同的功能,但带有额外的 promise 接口(interface)。

如下所示读取单个文件的内容会按预期工作并将文件的内容记录到控制台:

const fse = require('fs-extra')

const filePath = './foo.txt'


fse.readFile(filePath, 'utf8')
.then(filecontents => {
return filecontents
})
.then(filecontents => {
console.log(filecontents)
})

但是,我需要处理给定目录中的多个文件。为此,我需要执行以下步骤:

  1. 使用 fse.readdir() 获取目录内所有文件的数组 - 完成
  2. 使用 path.join.map() 连接文件名和目录名以获得一种基本文件路径,以避免遍历数组 - 完成
  3. 在另一个 .map() 中使用 fse.readFile() 读取文件内容>

这三个步骤具体实现如下:

const fse = require('fs-extra');
const path = require('path');

const mailDirectory = './mails'


fse.readdir(mailDirectory)
.then(filenames => {
return filenames.map(filename => path.join(mailDirectory, filename))
})
.then(filepaths => {
// console.log(filepaths)
return filepaths
.map(filepath => fse.readFile(filepath).then(filecontents => {
return filecontents
}))
})
.then(mailcontents => {
console.log(mailcontents)
})

如上所述,第 1 步和第 2 步运行良好。但是,我无法在最后一个 .map() 中使用 fse.readFile() 读取文件内容,这会导致

[ Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> } ]

输出表明 promise 尚未解决。我假设这个 Unresolved promise 是 fse.readFile() 函数返回的 promise 。但是我无法正确解决它,因为我的第一个代码段中的类似方法非常有效。

我该如何解决这个问题?我是 JS 领域的新手,尤其是 Node.js 领域的新手,它到底来自哪里?

最佳答案

你有一个 Promise 数组。您应该使用 Promise.all() 等待他们:

const fse = require('fs-extra');
const path = require('path');

const mailDirectory = './mails'


fse.readdir(mailDirectory)
.then(filenames => {
return filenames.map(filename => path.join(mailDirectory, filename))
})
.then(filepaths => {
// console.log(filepaths)
return filepaths
.map(filepath => fse.readFile(filepath).then(filecontents => {
return filecontents
}))
})
// Promise.all consumes an array of promises, and returns a
// new promise that will resolve to an array of concrete "answers"
.then(mailcontents => Promise.all(mailcontents))
.then(realcontents => {
console.log(realcontents)
});

此外,如果您不想对 fs-extra 有额外的依赖,您可以使用 Node 8 的新 util.promisify()使 fs 遵循面向 Promise 的 API。

关于javascript - 在 .map() 中使用 fse.readFile(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46531984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com