在.map()

时间:2017-10-02 19:00:45

标签: javascript node.js promise fs

我正在尝试使用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)
    })

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

  1. 使用fse.readdir() - 完成
  2. 获取目录中所有文件的数组
  3. 使用path.join.map()连接文件名和目录名以获取一种基本文件路径,以避免迭代数组 - 已完成
  4. 使用fse.readFile()
  5. 中的.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领域?

1 个答案:

答案 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。