javascript - 读取多个目录中的文件,使用 Node 和 Promises 将文件名与其数据匹配

标签 javascript node.js promise fs

我有一个目录数组。

var directories = ['/dir1', '/dir2'];

我想读取这些目录下的所有文件,最后有一个对象将文件名与其 base64/utf8 数据相匹配。在我的例子中,这些文件是图像。生成的对象可能如下所示:

var result = {
 '/dir1': {
  'file1': 'iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAIAAACx0UUtAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWF...',
  'file2': 'iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAIAAACx0UUtAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWF...'   
 }
}

我通过回调 hell 轻松实现了这一点,但是当我尝试使用 Promises 时,我不确定如何将目录信息和文件名传递给后续的 then() 和 map() 函数。

在下面的示例中,我使用的是 Bluebird 库:

const Promise = require('bluebird'),
  fs = Promise.promisifyAll(require('fs'));

var getFiles = function (dir) {
      return fs.readdirAsync(dir);
  };

Promise.map(directories, function(directory) {
    return getFiles(directory)
  }).map(function (files) {
    // which directory's files are these?
    return files;
  })

下一步将遍历文件并读取它们的数据。

我不介意答案是 ES6、Bluebird 还是 Q。

最佳答案

Bluebird 最简单的方法是使用 props :

function getFiles(paths) { // an array of file/directory paths
    return Promise.props(paths.reduce(function (obj, path) {
        obj[path.split("/").pop()] = fs.statAsync(path).then(function (stat) {
            if (stat.isDirectory())
                return fs.readdirAsync(path).map(function (p) {
                    return path + "/" + p;
                }).then(getFiles);
            else if (stat.isFile())
                return fs.readFileAsync(path);
        }).error(function (e) {
            console.error("unable to read " + path + ", because: ", e.message);
            // return undefined; implied
        });
        return obj;
    }, {}));
}

关于javascript - 读取多个目录中的文件,使用 Node 和 Promises 将文件名与其数据匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29948139/

相关文章:

javascript - TypeORM:无法读取未定义的属性 'getParameters'

javascript - 如何在 Visual Studio 2010 中对文件系统更改运行命令?

javascript - 使用 Nashorn JavaScript Engine (Java 8) 访问 ScriptContext 变量

node.js - yarn 添加命令返回 http 405

javascript - 从 Parse promise 链返回数据

javascript - 在 fabric js 中使用事件处理程序 (.on) 将数据发送到函数

node.js - 发送 Node 后无法设置 header

node.js - MongoDB 中集合级别的数据库池?

javascript - 从 Bluebird Promise 对象访问 jQuery $.get URL

android - 来自 React Native 的 AsyncStorage 中的 Promises