Эти примеры будут очень упрощенными, но, надеюсь, вы поймете суть.
Скажем, у меня есть функция как таковая, которая выполняет ряд задач и может занять много времени:
async function doSomeStuff() {
await aLongTask();
await anotherBigOldTask();
await bigNestedTaskThatTakesForever();
return Promise.resolve('Done');
}
Теперь у меня есть часы chokidar, которые ищут изменения файлов и запускают указанную функцию:
const watcher = chokidar.watch(watchURLs, {
ignored: /\.git/,
ignoreInitial: true,
persistent: true,
ignorePermissionErrors: true,
atomic: 500,
});
watcher.on('all', async (event, filePath) => {
await doSomeStuff();
});
Проблема заключается в том, что, когда файлы меняются много раз во время работы doSomeStuff()
, он пытаетсязапустить сборку несколько раз.Это приводит к целому ряду ошибок, которые я грубо исправил с помощью тайм-аута:
if (!locked) {
await doSomeStuff().finally(() => {
locked = false;
info('Waiting for file changes in', ...watchURLs);
});
}
else {
debug('Attempting to trigger a locked build');
}
locked = true;
clearTimeout(lockTimeout);
lockTimeout = setTimeout(() => {
locked = false;
debug('Unlocked due to timeout');
}, 10000);
Это останавливает вещи от полного взрыва, но это означает, что все всегда будет отсутствоватьдаты.Только при сохранении файла после истечения периода отсрочки блокировки он будет извлечен.И если загрузка файлов сохранена, она может быть собрана только с половиной обновленных включенных.
Итак, как можно полностью отменить / остановить / откатить функцию doSomeStuff()
непосредственно перед новой сборкойсрабатывает?Я не хочу делать что-то, где я устанавливаю переменную, которая заставляет doSomeStuff()
возвращать то, что я обертываю вокруг каждой задачи, потому что это не является немедленным и не работает для любых сложных функций, вложенных внутрь.Это почти как если бы я хотел выдать ошибку в функцию, а не эту функцию, управляющую тем, что бросить для себя.
Может кто-нибудь придумать способ немедленного принудительного завершения функциивыполнение без уничтожения всего сценария (а-ля process.exit()
)?Или если есть простой способ сделать это?ТИА.