Node.js文件系统:Promise一旦读取所有文件

时间:2017-09-09 19:02:16

标签: javascript node.js fs

我正在使用Node.js文件系统来构建文件路径数组。我想知道所有文件何时被读取,所以我可以继续使用我的数组。

事件顺序:

  1. 进入文件夹
  2. 获取每个文件的路径
  3. 将每个路径放入数组
  4. 一旦你完成,请告诉我
  5. 代码:

    'use strict';
    
    const fs = require('fs');
    
    function readDirectory(path) {
      return new Promise((resolve, reject) => {
        const files = [];
        fs.readdir(path, (err, contents) => {
          if (err) {
            reject(err);
          }
          contents.forEach((file) => {
            const pathname = `${ path }/${ file }`;
            getFilesFromPath(pathname).then(() => {
              console.log('pathname', pathname);
              files.push(pathname);
            });
            resolve(files);
          });
        });
      });
    }
    
    function getFilesFromPath(path) {
      return new Promise((resolve, reject) => {
        const stat = fs.statSync(path);
    
        if (stat.isFile()) {
          fs.readFile(path, 'utf8', (err, data) => {
            if (err) {
              reject(err);
            } else {
              resolve(data);
            }
          });
        } else if (stat.isDirectory()) {
          readDirectory(path);
        }
      });
    }
    
    getFilesFromPath('./dist');
    

    非常适合粘贴:

    Promise.all(files).then(() => {
        // do stuff
    })
    

1 个答案:

答案 0 :(得分:2)

你的建议很有效 - 你试过吗?这是一种典型的做法:

getFilesFromPath( path ).then( files => {
   const filePromises = files.map( readFile );
   return Promises.all( filePromises );
}).then( fileContentsArray => {
   //do stuff - the array will contain the contents of each file
});

你必须写" readFile()"自己发挥作用,但看起来你已经覆盖了它。