函数 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/