我遇到了Node.js函数的问题。我很确定这只是函数异步的问题,但我想确定。我正在检查用户输入的某个路径是否有效,方法是检查它是否存在。
var directoryExists = exports.directoryExists = function(filePath) {
return new Promise(function(resolve, reject) {
if (fs.statSync(filePath).isDirectory()){
resolve("Valid");
} else {
reject("Invalid");
}
});
}
这些是我对函数的调用:
files.directoryExists(sourcePath).then((msg) => {
console.log(msg);
}).catch(function(){
console.error("Promise Rejected");
});
files.directoryExists(destPath).then((msg) => {
console.log(msg);
}).catch(function(){
console.error("Promise Rejected");
});
我对异步编程和承诺的整个概念都很陌生,所以这变得非常令人沮丧。任何帮助将不胜感激。
答案 0 :(得分:2)
虽然你可以做出改进以改善它,但这并不是异步的事情,但是你可以做出改变。
statSync
可以抛出异常(例如,如果路径与任何东西都不匹配);你没有处理它,所以当它抛出时,它会被转换为拒绝。如果您查看了catch
处理程序中的参数,您会看到它引发的异常。
异步改进是因为您使用的是Promise
,所以没有理由使用statSync
。只需使用stat
,这样就不会不必要地占用JavaScript线程。
这就是:
var directoryExists = exports.directoryExists = function(filePath) {
return new Promise(function(resolve, reject) {
// Make the request asynchronous
fs.stat(filePath, function(err, data) {
// If there was an error or it wasn't a directory...
if (err || !data.isDirectory()) {
// ...reject
reject(err || new Error("Not a directory");
} else {
// All good
resolve(data);
}
});
});
};
当然,如果该东西不是目录或任何其他选择,您可以选择使用false
来解决它;这只会让你更进一步。
例如,错误仍然是拒绝,但是使用true
/ false
解析是否存在某个目录;这为调用者提供了最大量的信息,但如果他们关心的是真/假,则会让他们更加努力:
var directoryExists = exports.directoryExists = function(filePath) {
return new Promise(function(resolve, reject) {
// Make the request asynchronous
fs.stat(filePath, function(err, data) {
if (err) {
// Reject on error
reject(err);
} else {
// Return result on success
resolve(data.isDirectory());
}
});
});
};
或使其始终解决,false
如果没有匹配或匹配,但它不是目录:
var directoryExists = exports.directoryExists = function(filePath) {
return new Promise(function(resolve) {
// Make the request asynchronous
fs.stat(filePath, function(err, data) {
resolve(!err && data.isDirectory());
});
});
};
此功能的行为方式很多,取决于你。