Javascript - Подождите 5 секунд до выполнения следующей строки

Эта функция ниже не работает, как я хочу, - будучи новичком JS, я не могу понять, почему.

Мне нужно, чтобы он подождал 5 секунд, прежде чем проверять, есть ли newState -1.

В настоящее время он не ждет, он просто проверяет сразу.

function stateChange(newState) {
  setTimeout('', 5000);

  if(newState == -1) {
    alert('VIDEO HAS STOPPED');
  }
}

Ответ 1

Вы должны поместить свой код в функцию обратного вызова, которую вы передаете на setTimeout:

function stateChange(newState) {
    setTimeout(function () {
        if (newState == -1) {
            alert('VIDEO HAS STOPPED');
        }
    }, 5000);
}

Любой другой код будет немедленно выполнен.

Ответ 2

Вы действительно не должны этого делать, правильное использование тайм-аута - это правильный инструмент для проблемы OP и любой другой случай, когда вы просто хотите запустить что-то через некоторое время. Джозеф Зильбер продемонстрировал это в своем ответе. Однако, если в каком-то непроизводственном случае вы действительно хотите повесить основной поток в течение определенного периода времени, это сделает это.

function wait(ms){
   var start = new Date().getTime();
   var end = start;
   while(end < start + ms) {
     end = new Date().getTime();
  }
}

С исполнением в форме:

console.log('before');
wait(7000);  //7 seconds in milliseconds
console.log('after');

Я приехал сюда, потому что я строю простой тестовый пример для последовательности асинхронных операций вокруг длительных операций блокировки (т.е. дорогостоящих манипуляций с DOM), и это моя симулированная операция блокировки. Это подходит для этой работы, поэтому я решил опубликовать ее для всех, кто приезжает сюда с аналогичным вариантом использования. Тем не менее, он создает объект Date() в цикле while, который может сильно перегружать GC, если он работает достаточно долго. Но я не могу подчеркнуть достаточно, это подходит только для тестирования, для создания любой реальной функциональности вы должны обратиться к ответу Джозефа Зильбера.

Ответ 3

Вы не должны просто пытаться приостановить 5 секунд в javascript. Это не работает. Вы можете запланировать функцию кода для запуска через 5 секунд, но вы должны поместить код, который вы хотите запустить позже, в функцию и остальную часть вашего кода после того, как эта функция будет продолжать работать сразу.

Например:

function stateChange(newState) {
    setTimeout(function(){
        if(newState == -1){alert('VIDEO HAS STOPPED');}
    }, 5000);
}

Но если у вас есть такой код:

stateChange(-1);
console.log("Hello");

Оператор console.log() будет запущен немедленно. Он не будет ждать, пока тайм-аут не загорится в функции stateChange(). Вы не можете просто приостановить выполнение javascript в течение предопределенного промежутка времени.

Вместо этого любой код, который вы хотите задерживать, должен находиться внутри функции обратного вызова setTimeout() (или вызван из этой функции).

Если вы попытались "приостановить" цикл, тогда вы существенно "повесили" интерпретатор Javascript в течение определенного периода времени. Поскольку Javascript запускает ваш код только в одном потоке, когда вы зацикливаете, ничто другое не может запускаться (никакие другие обработчики событий не могут быть вызваны). Таким образом, цикл, ожидающий изменения какой-либо переменной, никогда не будет работать, потому что никакой другой код не может работать, чтобы изменить эту переменную.

Ответ 4

Если вам разрешено использовать jquery:

var delay = ( function() {
    var timer = 0;
    return function(callback, ms) {
        clearTimeout (timer);
        timer = setTimeout(callback, ms);
    };
})();

Использование:

delay(function(){
    // do stuff
}, 600 ); // end delay

Кредиты идут на пользователя CMS, см. Как задержать обработчик .keyup(), пока пользователь не перестанет печатать?

Ответ 5

Попробуйте следующее:

//the code will execute in 1 3 5 7 9 seconds later
function exec() {
    for(var i=0;i<5;i++) {
        setTimeout(function() {
            console.log(new Date());   //It you code
        },(i+i+1)*1000);
    }
}

Ответ 6

Лучший способ создать такую ​​функцию для ожидания в миллисекундах, эта функция будет ждать миллисекунды, предоставленные в аргументе:

function waitSeconds(iMilliSeconds) {
    var counter= 0
        , start = new Date().getTime()
        , end = 0;
    while (counter < iMilliSeconds) {
        end = new Date().getTime();
        counter = end - start;
    }
}

Ответ 7

Основываясь на сообщении Джозефа Сильвера , я сделаю так, немного более общий.

У вас будет ваша функция (создайте ее на основе вопроса):

function videoStopped(newState){
   if (newState == -1) {
       alert('VIDEO HAS STOPPED');
   }
}

И у вас может быть функция ожидания:

function wait(milliseconds, foo, arg){
    setTimeout(function () {
        foo(arg); // will be executed after the specified time
    }, milliseconds);
}

В конце вы получили бы:

wait(5000, videoStopped, newState);

Это решение, я бы предпочел не использовать аргументы в функции wait (только для foo(); вместо foo(arg);), но для примера.

Ответ 8

с использованием angularjs:

$timeout(function(){
if(yourvariable===-1){
doSomeThingAfter5Seconds();
}
},5000)

Ответ 9

Здесь используется решение, использующее новый синтаксис async/await.

Обязательно проверьте поддержку браузера, поскольку это новая функция, введенная с ECMAScript 6.

function wait(ms){
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

Использование:

async function yourFunction() {
  await wait(5000);
  console.log("Waited 5s");
}