Часто сталкиваюсь с проблемой организации последовательного выполнения кода при работе с асинхронными функциями. Особенно это заметно при наличии условий, когда в одном случае нужно вызвать асинхронную функцию, а потом некий блок кода, а в другом просто этот же блок кода. Ниже типичный пример: перед распаковкой архива проверяется наличие папки под его содержимое, если такой папки нет, то она создаётся, а потом архив в неё распаковывается, если папка есть, то создавать ничего не надо и архив просто распаковывается в папку. Получается, что код, который отвечает за распаковку и удаление архива дублируется, и в другом случае кода может быть больше, как и условий, в итоге получается какая-то жуткая каша. Мне приходят в голову только два варианта и они оба не очень:
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);
}
});
});
// ---------------------------------
})
}