@Dmitry-H87

Как избежать дублирования кода при ветвлении с использованием асинхронных функций?

Часто сталкиваюсь с проблемой организации последовательного выполнения кода при работе с асинхронными функциями. Особенно это заметно при наличии условий, когда в одном случае нужно вызвать асинхронную функцию, а потом некий блок кода, а в другом просто этот же блок кода. Ниже типичный пример: перед распаковкой архива проверяется наличие папки под его содержимое, если такой папки нет, то она создаётся, а потом архив в неё распаковывается, если папка есть, то создавать ничего не надо и архив просто распаковывается в папку. Получается, что код, который отвечает за распаковку и удаление архива дублируется, и в другом случае кода может быть больше, как и условий, в итоге получается какая-то жуткая каша. Мне приходят в голову только два варианта и они оба не очень:
1) в данном случае можно использовать синхронный вариант mkdirSync, но он, вроде как, стопорит поток, что не желательно, кроме того, не у всех функций есть синхронные аналоги.
2) вынести дублируемый код в отдельную функцию и вызывать её столько раз, сколько потребуется. Наверное, этот вариант более предпочтителен, но всё равно выглядит как-то криво и избыточно

Ни до чего другого я сам додуматься не смог. Может кто-то знает лучшее решение?

function unpackFile(name) {
    const file = getFilename(name);
    const unpackDir = `${watchDir}\\${file}`;
    fs.access(unpackDir, fs.constants.F_OK, (err) => {
        if (err) {
            fs.mkdir(unpackDir, (err) => {
                // дублируемый код -----------------
                childProcess.exec(`"${unrarPath}" e "${name}" "${unpackDir}"`, (error, stdout, stderr) => {
                    fs.unlink(name, (err) => {
                        if (err) {
                            console.log(err);
                        }
                    });
                });
                // ---------------------------------
            });
        }
        // дублируемый код -----------------
        childProcess.exec(`"${unrarPath}" e "${name}" "${unpackDir}"`, (error, stdout, stderr) => {
            fs.unlink(name, (err) => {
                if (err) {
                    console.log(err);
                }
            });
        });
        // ---------------------------------
    })
}
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 2
alex_keysi
@alex_keysi
Помог с решением? Отметь “правильный ответ”
создай файл utils.js
и запихни туда часто используемые функции.
то что в функции выносить это у тебя верное решение.
возможно тебе подойдет вынести в отдельный файл твои функции работы с файллвой системой.
как модуль fs вынесен в отдельный модуль, так и ты можешь назвать его fsUtils
Ответ написан
dpigo
@dpigo
Front-end developer
Колбэк в отдельную функцию, шаблон комманды в отдельную переменную.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
RealtimeBoard Пермь
от 90 000 до 140 000 руб.
Smartbics Нижний Новгород
от 50 000 до 70 000 руб.
//stablecode Вена
от 110 000 до 140 000 руб.
20 февр. 2019, в 10:05
1800 руб./за проект
20 февр. 2019, в 09:00
1500 руб./за проект
20 февр. 2019, в 08:11
8000 руб./за проект