javascript - Bluebird promise 未定义?

标签 javascript node.js promise bluebird

我正在使用 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/

相关文章:

javascript - 如何将名称添加到 json 中的现有值对

javascript - 如何在 Bootstrap 模态中产生数据幻灯片效果?

javascript - 使用 jquery 操作复选框和文本框

javascript - Angular : Is this the correct way to chain promises?

javascript - Node.js 第一次使用 promise 不更改数据

javascript - 如何使用codeigniter从动态创建的表中的数据库中获取数据

javascript - 如何验证变量实际上是 joi 模式?

javascript - Node.js 事件发射器是否必须绑定(bind)到自定义对象才能有效使用它们?

node.js - 默认日期不适用于 Mongoose

node.js - Bluebird 与 Lambda 不返回数据