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