我正在使用 Node 4.5+ 和 bluebird。我打算将以下代码与 then
一起使用:
var checkdir = function(directory) {
return new Promise(function(resolve, reject) {
fs.statAsync(directory).then(function() {
resolve(true);
}).catch(function(err) {
if(err.code === 'ENOENT') {
fs.mkdirAsync(directory).then(function() {
resolve(true);
}).catch(function() {
reject(new Error('Can not create folder'));
});
} else {
reject(new Error('Unknown fs stat error: ' + err));
}
});
});
};
Async
函数来自 fs-extra-promise
模块。但是,当我尝试使用此函数时,我收到未处理的拒绝错误:未知错误:TypeError:无法读取未定义的属性“then”
。
调用:
checkdir(dir).then(function() {
...
}).catch(function(err) {
reject(new Error('Unknown error: ' + err));
});
这里出了什么问题?
最佳答案
在文件系统操作中使用任何类型的“存在”检查都是 actively discouraged在 Node 文档中。 (无论您使用 stat
还是使用 exists
进行存在检查都无关紧要。)
这意味着,除了 Benjamin Gruenbaum 关于 the improper use of promises in general 的评论之外在您的代码中,还有另一点需要注意:
创建目录的正确方法是无条件调用 mkdir
并忽略 EEXIST
(比较 this answer 了解更多上下文)。
var fs = Promise.promisifyAll(fs);
var ensureDir = function ensureDir(path) {
return fs.mkdirAsync(path).catch((err) => { if (err.code !== 'EEXIST') throw err; });
}
您可以使用the mkdirp
module递归地创建路径,就像 mkdir -p
那样。
关于javascript - Bluebird promise 未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39446644/