我应该使用mkdir的承诺吗?

时间:2016-02-25 10:51:27

标签: javascript promise bluebird

我使用蓝鸟魔法

var fs = Promise.promisifyAll(require('fs'));

并使用

fs.readdirAsync(dest).then(function (val) {
        return val;
}).then(function (file) {

...

我的问题是以下代码(工作正常)我应该使用相同的和如何使用 我在谈论mkdir函数。

function createDir(folder) {
    return function (req, res, next) {
        if (typeof require.cache.per === 'undefined') {
            require.cache.per = {};
            require.cache.per.mk = false;
        }
        if (!require.cache.per.mk) {
            fs.mkdir(folder, function (e) {
                if (!!e && e.code !== 'EEXIST') {
                    console.log('Error to create  folder: ' + err);
                }
                require.cache.per.mk = true;
                next();
            });
        } else {
            next();
        }
    };
}

我的问题是我应该在这里使用诺言,推荐什么? 代码按预期工作......

3 个答案:

答案 0 :(得分:6)

Promise简化并统一界面。 .promisify().promisifyAll()都可以解决问题。

然后你可以链接这样的一切:

fs.mkdir(dir)
    .then(function success(dir) {
        ...
    })
    .catch(function failure(err) {
        ...
    })
    .finally(function () {
    });

但是在node.js中,最重要的是不阻止I / O.使用Promise或常规异步/回调并不重要,只要它不阻塞主线程。

在脚本中创建要在shell中运行的同步代码是可以的,但对于常规应用程序,您不应该故意使用阻塞I / O操作。

答案 1 :(得分:0)

Promise.promisifyAll(fs);

return fs.mkdirAsync(dir1)
  .then(function() {
    return fs.mkdirAsync(dir2);
  })
  .then(function() {
    return fs.mkdirAsync(dir3);
  })

希望这有帮助。

答案 2 :(得分:0)

我肯定会更新您的代码以保持一致。如果可能,请拨打mkdirAsync而不是mkdir

示例(来自OP的代码):

var fs = Promise.promisifyAll(require('fs'));

// ...

fs.mkdirAsync(folder)
   .catch({ code: 'EEXIST' }, function(e){
       // don't care about this error code  
   })
   .catch(function(e) {
       console.log('Error to create  folder: ' + e);
   })
   .then(function(){
       require.cache.per.mk = true;
       next();
   });