蓝鸟承诺未定义?

Bluebird promise is undefined?

我正在使用节点 4.5+ 和蓝鸟。我有以下代码,我打算与 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 模块。但是,当我尝试使用此功能时,我得到 Unhandled rejection Error: Unknown error: TypeError: Cannot read property 'then' of undefined.

通话中:

                checkdir(dir).then(function() {
                    ...
                }).catch(function(err) {
                    reject(new Error('Unknown error: ' + err));
                });

这里有什么问题?

节点文档中 actively discouraged 使用任何类型的 "exists" 检查文件系统操作。 (无论您是使用 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 那样。