编程语言
首页 > 编程语言> > javascript-Q承诺-数组中每个元素的Node.js函数

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

作者:互联网

函数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不了解诺言,因此它只会看到真实值(实际上是诺言对象)并将文件添加到输出列表中.解决问题的一种方法如下(使用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);
    });

标签:q,javascript,node-js,promise
来源: https://codeday.me/bug/20191013/1906081.html