JavaScript承诺和if/else语句
当我为目录(JavaScript承诺和if/else语句,javascript,node.js,if-statement,promise,q,Javascript,Node.js,If Statement,Promise,Q,当我为目录(/)使用filemanager函数时,代码工作正常,但当我调用file(/index.html)时,代码返回错误 我看到if/else语句中的问题(readdir即使isDir返回了false),但我不知道如何正确地使用它 var fs = require('fs'), Q = require('q'), readdir = Q.denodeify(fs.readdir), readFile = Q.denodeify(fs.readFile); funct
/
)使用filemanager
函数时,代码工作正常,但当我调用file(/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(path)
的调用结果是一个承诺。所以你不能直接从这个函数中得到结果。相反,您必须等待返回的承诺得到解决,然后在那里评估值。因此,您需要一个像isDir(path)这样的构造。然后(…)
而不是当前使用的if(isDir(path))
。isDir
返回一个承诺,它始终是一个真实值。您需要将条件放入中,然后
回调才能访问布尔值:
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 ...;
});
}
});
}