#javascript #promise #async-await
#javascript #обещание #асинхронный-ожидание
Вопрос:
У меня есть render()
функция, и внутри нее есть эта sleep()
функция:
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
(Используя это внутри асинхронной функции)
При первом запуске все в порядке, но когда я нажимаю на кнопку «Новая игра» (которая вызывает render()
), создается новая Promise
, но предыдущая все еще там. Таким sleep()
образом, время подсчета удваивается.
Я прочитал документацию MDN и некоторые вопросы stackoverflow, но не нашел ответа на этот вопрос.
Может кто-нибудь объяснить мне, как Promise
на самом деле работает, и что я сделал не так?
РЕДАКТИРОВАТЬ: когда игра закончена и нажмите кнопку «Новая игра», все выглядит нормально, кроме таймера, который отсчитывает секунды дважды. Код:
const render = () => {
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const timerOnePlayer = async () => {
timer.innerHTML = 0;
timerText.innerHTML = "Eltelt idő";
while (!gameFinished) {
await sleep(1000);
timer.innerHTML = Number(timer.innerHTML) 1;
}
}
/** Some other irrelevant code*/
}
const resetValues = () => {
/** variables set to zero or empty */
render();
}
btnStart.addEventListener("click",render);
newGame.addEventListener("click",resetValues);
Комментарии:
1. Каждый раз, когда вы вызываете эту строку кода, создается новое обещание тайм-аут. Это не уникально для обещаний. Если вы запускаете строку кода дважды, она выполняется дважды. Я думаю, что ваш вопрос не о promises или setTimeout, а о том, как они работают с рендерингом react.
2. Это внутри функции, которая возвращается в конце игры. Я думаю (может быть, это неправильно), если функция вернется, каждая переменная и все, что я создал внутри нее, будут удалены по умолчанию. По крайней мере, в Java это работало так. Поэтому я думаю, что проблема либо в
Promise
orasync
.3. Что вы пытаетесь сделать с этим кодом в первую очередь? Похоже, это
const sleep = (ms,resolve) => setTimeout(resolve,ms);
позволит вам подождать определенное количество времени, а затем запустить функцию обратного вызова. Или просто вызывая setTimeout без его завершения.4. Ваша версия sleep лучше, я не знал, что это работает таким образом. И использование этой функции:
const timerOnePlayer = async () => { /** ... */ while (!gameFinished) {await sleep(1000); } /** ... */};
. Извините за редактирование.5. Пожалуйста, покажите нам ваш фактический код для функции, а затем опишите в терминах этого фактического кода, в чем проблема.
Ответ №1:
Когда я начинал этот проект, я действительно не знал, как Promise
setIntervall
это работает. Но с комментариями я понял, что не так, удален sleep()
из проекта и заменен на just setIntervall
. Теперь все работает нормально, так что еще раз спасибо!
const timerOnePlayer = () => {
timer.innerHTML = 0;
timerText.innerHTML = "Eltelt idő";
onePlayerInterval = setInterval(() => {
timer.innerHTML = Number(timer.innerHTML) 1;
if (gameFinished) clearInterval(onePlayerInterval);
}, 1000);
};