javascript - Q promises - 数组中每个元素的 Node.js 函数

标签 javascript node.js promise q

函数 dirList() 应该返回定义目录内的文件夹数组。我不明白如何仅在为每个文件执行函数 isDir() 后才返回 dirList 变量。

我想我应该使用Q.all(),但我不知道应该把它放在哪里:-(

var fs = require('fs'),
    Q = require('q'),
    readdir = Q.denodeify(fs.readdir);

function isDir(path) {
    return Q.nfcall(fs.stat, __dirname + path)
        .then(function (stats) {
            if (stats.isDirectory()) {
                return true;
            } else {
                return false;
            }
        });
}

function dirList(path) {
    return readdir(__dirname + path).then(function (files) {
        var dirList = files.filter(function (file) {
                return isDir(path + file).then(function (isDir) {
                    return isDir;
                });
            });
        return dirList;
    });
}

dirList('/').done(
    function (data) {
        console.log(data);
    },
    function (err) {
        console.log(err);
    }
);

最佳答案

您遇到的问题是 Array.prototype.filter 不知道 promises,所以它只看到一个真值(实际上是一个 promise 对象)并将文件添加到输出列表。解决问题的一种方法如下(可能有一种“更干净”的方法,如 AsyncJS):

'use strict';

var fs = require('fs'),
    Q = require('q'),
    readdir = Q.denodeify(fs.readdir);

function isDir(path) {
    return Q.nfcall(fs.stat, __dirname + path)
        .then(function (stats) {
            return stats.isDirectory();
        });
}

function dirList(path) {
    return readdir(__dirname + path).then(function (files) {
        // here we map the list of files to an array or promises for determining
        // if they are directories
        var dirPromises = files.map(function (file) {
            return isDir(path + file);
        });
        // here is the Q.all you need
        return Q.all(dirPromises)
            // here we translate the array or directory true/false values back to file names
            .then(function(isDir) {
                return files.filter(function(file, index) { return isDir[index]; });
            });
    });
}

dirList('/').done(
    function (data) {
        console.log(data);
    },
    function (err) {
        console.log(err);
    });

关于javascript - Q promises - 数组中每个元素的 Node.js 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22027792/

相关文章:

javascript - 通过 JavaScript 加速将 HTML 元素附加到 div 中

javascript - 在我通过 Redux 传递它的特殊情况下,这个箭头函数如何工作

javascript - 将 blob(image) 传递给 php/laravel 并获取输入并保存

javascript - 无法将 babel 与 webpack 一起使用

node.js - 如何在nodejs中使用sweetalert?

javascript - Vert.x 相当于 Node.js 全局对象

node.js - 在 NodeJS 中卸载 CPU 繁重的 Promise 任务

javascript - 返回 promise 的函数的串行执行

javascript - 如何将多个 JS promise 链接到组合的 bool 结果

javascript - 无法使用 Javascript 编辑 CSS 样式