Задать вопрос
@trydim

JS. Как правильно синхронизировать события?

Здравствуйте, уважаемые!

Нуждаюсь в синхронизации событий.

/* кусок который не доступен для изменения (условно) */
const btnNode = document.querySelector('#btn');

const mainFunc = () => {
  // событие
}

btnNode.addEventListener('click', mainFunc);

/* кусок который не доступен для изменения (условно) */

const priorityFunc = async () => {
  const a = await new Promise(res => res(true));
  // приоритетное событие
}

btnNode.addEventListener('click', priorityFunc);

/* последняя */
const lastFunc = () => {
  // событие добавленное через какое-то время
}

btnNode.addEventListener('click', lastFunc);


Как сделать:
1) Хотелось бы добавить свою функцию-событие (priorityFunc), которая будет выполняться всегда первая и другие не запустятся пока она полностью не завершится. (со вторым справлюсь сам.)

2) а также знать как сделать так, что бы функция (priorityFunc) всегда выполнялась последняя, даже если кто-то потом допишет lastFunc (хотя он тоже может захотеть что бы его событие было всегда последним).
Тут можно, наверное, использовать setTimeout(), но сколько ставить задержку, что бы пользователь не думал что сайт тормозит.

В общем как правильно синхронизировать события и расставлять приоритеты?

Спасибо за внимание.
  • Вопрос задан
  • 287 просмотров
Подписаться 1 Средний 2 комментария
Решения вопроса 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
  1. Т.к. известен 1-й обработчик клика, его можно снять: removeEventListener('click', mainFunc);
  2. Повесить свой обработчик, в котором mainFunc и прочие вызывать только после отработки асинхронного кода.
  3. Переопределить метод addEventListener() на этой кнопке, чтобы все последующие обработчики складывать в массив. И вызывать их из массива только после своего и mainFunc.


Ответ написан
zkrvndm
@zkrvndm
Архитектор решений
1. Допишите в конце первого события, чтобы по выполнению запускал все остальные
2. Используйте промисы, а конкретно вам поможет Promise.all() - при помощи нее можно сделать так, чтобы нужное событие стартовало последним, только после завершения всех других событий
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
WblCHA
@WblCHA
Если по какой-то причине вышеперечисленные варианты не подходят, то остаётся только одно:
btnNode.addEventListener('click', priorityFunc, true);
                                                ^^^^
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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