2016-02-25 3 views
9

Я использую Bluebird магиюДолжен ли я использовать обещание для 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(); 
     } 
    }; 
} 

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

+1

Вы можете просто использовать 'mkdirAsync', promisifyAll создает его для вас. –

+0

@BenjaminGruenbaum -Спасибо, но как я могу назвать это с уловом и следующим внутренним обещанием, можете ли вы привести пример? –

+0

Точно так же, как вы делали для 'readdir' –

ответ

6

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

Тогда вы можете цепи все так:

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

Однако в node.js, самое главное, чтобы не блокировать I/O. Неважно, используете ли вы Promise или обычный асинхронный/обратный вызов, если он не блокирует основной поток.

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

+1

Я полностью согласен, обещания IMHO обеспечивают гораздо лучшую читаемость и ремонтопригодность для кода, который доказывает важность в командной работе – maurycy

1
Promise.promisifyAll(fs); 

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

Надеется, что это помогает.

1

Я бы точно уточнил ваш код, чтобы он был последовательным. Если возможно, вызовите mkdirAsync вместо mkdir

пример (из ОПА-кода в):

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(); 
    }); 
Смежные вопросы