@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);
                }
            });
        });
        // ---------------------------------
    })
}
  • Вопрос задан
  • 104 просмотра
Пригласить эксперта
Ответы на вопрос 2
alex_keysi
@alex_keysi
frontend developer
создай файл utils.js
и запихни туда часто используемые функции.
то что в функции выносить это у тебя верное решение.
возможно тебе подойдет вынести в отдельный файл твои функции работы с файллвой системой.
как модуль fs вынесен в отдельный модуль, так и ты можешь назвать его fsUtils
Ответ написан
dpigo
@dpigo
Front-end developer
Колбэк в отдельную функцию, шаблон комманды в отдельную переменную.
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
Admon Новосибирск
от 50 000 до 70 000 руб.
Энергомера Ставрополь
от 28 000 до 30 000 руб.
18 дек. 2018, в 20:42
5000 руб./за проект
18 дек. 2018, в 20:34
5000 руб./за проект
18 дек. 2018, в 20:01
10000 руб./за проект