Должен ли я использовать обещание для 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 ответа:
Обещание упрощает и унифицирует интерфейс. Либо
.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(); });