JavaScript承诺和if / else语句

当我使用filemanager函数为目录( / )代码效果很好,但是当我调用文件( /index.html )代码返回一个错误。

我发现if / else语句中的问题(即使isDir返回falsereaddir也会运行),但是我不知道如何正确地将它用于promise。

 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返回一个承诺,这总是一个真值。 你将需要把条件放在callback函数中来访问布尔值:

 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。 所以你不能直接从该函数得到结果。 相反,你必须等待返回的Promise解决,然后评估那里的价值。 所以,你需要像isDir(path).then(...)而不是你正在使用的if (isDir(path))