Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.08.2022, 18:07
Новичок на форуме
Отправить личное сообщение для rfnj Посмотреть профиль Найти все сообщения от rfnj
 
Регистрация: 10.11.2021
Сообщений: 4

Событие "click" не выполнялось стазу, а ожидало когда выполнится предыдущее событие
Функция выполняется в тот момент, когда ты нажал. Есть ли возможность дождаться полного выполнения события перед тем как приступить к другому событию. Подскажите как это сделать.
Ответить с цитированием
  #2 (permalink)  
Старый 16.08.2022, 19:34
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,199

Он и так ждёт полного выполнения, если всё синхронно.
<button id="button">click me</button>
<script>
function stall(ms) {
  const iterator = (function *() {
    const end = Date.now() + ms;
    while(Date.now() < end) yield true;
  }());  
  while(iterator.next().value);
}

function logTime(name) {
  console.log(name, new Date().toLocaleTimeString()); 
}

button.addEventListener('click', () => {
  logTime(1);

  stall(10000);
})
button.addEventListener('click', () => {
  logTime(2);
})
</script>


Если же у тебя там какие-то асинхронные действия выполняются, то только отменять событие по умолчанию на время ожидания асинхронного ответа(event.preventDefault()) и вызывать нужные действий руками после завершения ожидания.
Условно:
<button id="button">click me</button>
<script>
function delay(ms) {
  return new Promise(r => setTimeout(r, ms, true));
}

function logTime(name) {
  console.log(name, new Date().toLocaleTimeString()); 
}

let queue = null;

button.addEventListener('click', async () => {
  if (queue) return;

  logTime(1);

  queue = [];

  await delay(10000);

  queue.forEach(([name, func]) => {
    console.log('queued event', name);
    func();
  });
  queue = null;
})
button.addEventListener('click', (event) => {
  if (queue) {
    queue.push(['click 2', () => logTime(2)])
    event.preventDefault();
    event.stopPropagation();
  } else {
    logTime(2)
  }
})
</script>
__________________
29375, 35

Последний раз редактировалось Aetae, 16.08.2022 в 19:56.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск