Должен ли я использовать обещание для mkdir


Я использую магию Синей птицы

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();
        }
    };
}

Мой вопрос заключается в том, должен ли я использовать promise здесь или нет, что рекомендуется? Код работает, как и ожидалось...

3 8

3 ответа:

Обещание упрощает и унифицирует интерфейс. Либо .promisify(), либо .promisifyAll() сделают свое дело.

Тогда вы можете связать все так:

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

Однако в node.js Самое главное-не блокировать ввод-вывод. не имеет значения, используете ли вы обещание или обычный асинхронный / обратный вызов, пока он не блокирует основной поток.

Это нормально иметь синхронный код в скрипте, который вы хотите запустить в оболочке, но для обычных приложений вы никогда не должны использовать блокировку Операции ввода-вывода по назначению.

Promise.promisifyAll(fs);

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

Надеюсь, это поможет.

Я бы обязательно обновил ваш код, чтобы он был последовательным. Если возможно, вызовите 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();
   });