Подождите 5 секунд перед выполнением следующей строки
Заголовок: Проблема с функцией stateChange: не дожидается 5 секунд перед проверкой newState
Я новичок в JavaScript и не могу понять, почему моя функция не работает так, как мне нужно.
Мне нужно, чтобы она ждала 5 секунд перед тем, как проверять, равно ли значение переменной newState
значению -1
.
В текущей реализации она сразу же делает проверку, не дожидаясь задержки.
Вот код функции:
function stateChange(newState) {
setTimeout('', 5000);
if(newState == -1) {
alert('VIDEO HAS STOPPED');
}
}
Подскажите, как сделать так, чтобы проверка выполнялась только после 5-секундной паузы?
5 ответ(ов)
Вы должны поместить свой код в функцию обратного вызова, которую вы передаете в setTimeout
. Вот пример:
function stateChange(newState) {
setTimeout(function () {
if (newState == -1) {
alert('ВИДЕО ОСТАНОВИЛОСЬ');
}
}, 5000);
}
Любой другой код будет выполняться немедленно.
Вы не должны просто пытаться приостановить выполнение JavaScript на 5 секунд. Это не работает таким образом. Вы можете запланировать выполнение функции через 5 секунд, но при этом нужно поместить код, который вы хотите запустить позже, в отдельную функцию, и остальной код после этой функции продолжит выполняться немедленно.
Например:
function stateChange(newState) {
setTimeout(function(){
if(newState == -1){alert('ВИДЕО ОСТАНОВЛЕНО');}
}, 5000);
}
Однако, если у вас есть такой код:
stateChange(-1);
console.log("Привет");
Вывод console.log()
будет выполняться немедленно. Он не станет ждать завершения таймаута в функции stateChange()
. Вы не можете просто приостановить выполнение JavaScript на заранее определенный период времени.
Вместо этого, весь код, который вы хотите выполнить с задержкой, должен находиться внутри функции обратного вызова setTimeout()
(или вызываться из этой функции).
Если бы вы пытались "приостановить" выполнение, используя цикл, вы фактически "повесили" бы интерпретатор JavaScript на определенный период времени. Поскольку JavaScript выполняет ваш код в едином потоке, когда вы зациклены, ничего другого не может выполняться (никакие другие обработчики событий не могут быть вызваны). Таким образом, ожидание изменения переменной в цикле не сработает, потому что никакой другой код не сможет выполниться для изменения этой переменной.
Этот код скроет элемент с классом .message
через 5 секунд. Функция setTimeout
используется для выполнения кода по истечении заданного времени (в данном случае 5000 миллисекунд).
Если у вас есть асинхронная функция, вы можете использовать следующий код для создания задержки:
await new Promise(resolve => setTimeout(resolve, 5000));
Этот код создаёт новый промис, который выполняется через 5 секунд благодаря функции setTimeout
. Используя await
, вы заставляете вашу асинхронную функцию ждать завершения этого промиса перед выполнением следующего кода. Это полезно, если вам нужно приостановить выполнение на некоторое время.
В вашем коде есть ожидаемая задержка для выполнения функции, однако использование переменной i
внутри замыкания setTimeout
приводит к тому, что она используется в момент выполнения, а не в момент определения. Это означает, что все таймеры будут ссылаться на одно и то же значение i
, которое приведет к тому, что вывод будет производиться в одно и то же время, после завершения цикла.
Чтобы исправить это, вы можете использовать замыкание или метод let
, чтобы создать новую область видимости для каждой итерации цикла. Вот исправленная версия:
// Код будет выполняться через 1, 3, 5, 7 и 9 секунд
function exec() {
for (let i = 0; i < 5; i++) { // Используем let вместо var
setTimeout(function() {
console.log(new Date()); // Ваш код
}, (i + i + 1) * 1000);
}
}
С использованием let
каждая итерация цикла создает новую переменную i
, которая будет иметь значение, соответствующее текущей итерации при выполнении функции setTimeout
. Теперь вывод будет происходить через 1, 3, 5, 7 и 9 секунд, как вы и ожидали.
event.preventDefault() против return false: в чем разница?
Остановить вызов setInterval в JavaScript
Получение ID элемента, вызвавшего событие
Как запустить JavaScript после загрузки страницы?
Преимущества addEventListener по сравнению с onclick