当我使用filemanager
函数进行目录(/
)代码时,代码运行良好,但是当我调用文件(/index.html
)代码时返回错误。
我看到 if/else 语句中的问题(即使返回readdir
isDir
false
也会运行),但我不知道如何正确地将其与承诺一起使用。
var fs = require('fs'),
Q = require('q'),
readdir = Q.denodeify(fs.readdir),
readFile = Q.denodeify(fs.readFile);
function isDir(path) {
return Q.nfcall(fs.stat, __dirname + path)
.then(function (stats) {
if (stats.isDirectory()) {
return true;
} else {
return false;
}
});
}
function filemanager(path) {
if (isDir(path)) {
return readdir(__dirname + path)
.then(function (files) {
return files.map(function (file) {
return ...;
});
})
.then(Q.all);
} else {
return readFile(__dirname + path, 'utf-8')
.then(function (content) {
return ...;
});
}
}
filemanager('/').done(
function (data) {
...
},
function (err) {
...
}
);
>isDir
返回一个承诺,该承诺始终是真实值。您需要将条件放在then
回调中才能访问布尔值:
function isDir(path) {
return Q.nfcall(fs.stat, __dirname + path)
.then(function (stats) {
return stats.isDirectory()
});
}
function filemanager(path) {
return isDir(path).then(function(isDir) {
if (isDir) {
return readdir(__dirname + path)
.then(function (files) {
return files.map(function (file) {
return ...;
});
})
.then(Q.all);
} else {
return readFile(__dirname + path, 'utf-8')
.then(function (content) {
return ...;
});
}
});
}
你对isDir(path)
的调用评估为承诺。因此,您无法直接从该函数获得结果。相反,您必须等待返回的 Promise 解析,然后在那里评估值。因此,您需要像isDir(path).then(...)
这样的构造,而不是当前正在使用的if (isDir(path))
。