Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как остановить выполнение функции до нажатия кнопки? (https://javascript.ru/forum/events/83422-kak-ostanovit-vypolnenie-funkcii-do-nazhatiya-knopki.html)

MiavchikM 04.12.2021 10:52

Как остановить выполнение функции до нажатия кнопки?
 
На сайте есть обычная кнопка <button>. Я хочу, чтобы до нажатия кнопки выполнение функции остановилось, примерно так:
function doSomething(){
doSomeStuff();
//код, останавливающий выполнение до нажатия кнопки
doSomeStuffAfter();
}

Варианты с onclick мне не подходят, так как нужно продолжить выполнять код в этой же функции. Подозреваю, что промиcы могут помочь, но не знаю, как их правильно сделать, такой вариант не работает:
async function function2(){
return new Promise((resolve, reject) => {
document.getElementById('button-1').addEventListener('click', () => resolve())
})
}
async function function1(){
await function2();
}

Aetae 04.12.2021 11:30

Вполне себе работает(чуть поправил, но принципа это не меняет):
async function function2(id){
  return new Promise((resolve) => document.getElementById(id).addEventListener('click', resolve, {once: true}))
}

async function doSomething(){
  doSomeStuff();
  await function2('button-1');
  doSomeStuffAfter();
}

voraa 04.12.2021 12:24

Но второй раз это уже не сработает.
Промис уже будет в разрешенном состоянии
Лучше так.
function doSomething(){
  doSomeStuff();
  const waitClick = () => {
     doSomeStuffAfter();
     document.getElementById('button-1').removeEventListener('click', waitClick)
  }

  document.getElementById('button-1').addEventListener('click', waitClick)
}

Aetae 04.12.2021 15:26

voraa, всмысле? function2 при вызове создаёт новый промис...

voraa 04.12.2021 15:53

Цитата:

Сообщение от Aetae
всмысле? function2 при вызове создаёт новый промис...

Ну да.
Но я не сторонник вешать промисы на такие события.
Промис все-таки должен когда то разрешиться


Часовой пояс GMT +3, время: 09:30.