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

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

Похожие вопросы