我正在尝试使用promises读取Node.js中几个文件的内容。由于标准fs
模块没有提供足够的promise接口,因此我决定使用fs-extra
来提供与默认fs
模块几乎相同的功能以及额外的promise接口。 / p>
如下所示读取单个文件的内容可以根据需要工作,并将文件的内容记录到控制台:
const fse = require('fs-extra')
const filePath = './foo.txt'
fse.readFile(filePath, 'utf8')
.then(filecontents => {
return filecontents
})
.then(filecontents => {
console.log(filecontents)
})
但是,我需要处理给定目录中的几个文件。为此,我需要实现以下步骤:
fse.readdir()
- 完成 path.join
和.map()
连接文件名和目录名以获取一种基本文件路径,以避免迭代数组 - 已完成 fse.readFile()
.map()
读取文件内容
醇>
这三个步骤实现如下:
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工作得非常好。但是,我无法在上一个fse.readFile()
内使用.map()
读取文件内容,从而导致
[ Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> } ]
输出表明尚未解决承诺。我假设这个未解决的承诺是fse.readFile()
函数返回的承诺。但是我无法正确解决它,因为我的第一个片段中的类似方法就像魅力一样。
我该如何解决这个问题?它是从哪里来的,因为我是JS领域的新手,特别是在Node.js领域?
答案 0 :(得分:4)
你有一个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
具有额外的依赖关系,则可以使用节点8的新util.promisify()
使fs
遵循面向Promise的API。