Выполнить скрипт после определенной задержки, используя JavaScript - PullRequest
178 голосов
/ 24 августа 2008

Существует ли какой-либо метод JavaScript, аналогичный jQuery delay() или wait() (чтобы задержать выполнение скрипта на определенное время)?

Ответы [ 14 ]

232 голосов
/ 24 августа 2008

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

Вам нужно передать функцию в качестве аргумента, чтобы она вызывалась позже. По сути это означает без скобок за именем. Следующее вызовет предупреждение сразу, и на нем отобразится «Hello world»:

var a = "world";
setTimeout(alert("Hello " + a), 2000);

Чтобы исправить это, вы можете указать имя функции (как это сделал Flubba) или использовать анонимную функцию. Если вам нужно передать параметр, вам нужно использовать анонимную функцию.

var a = "world";
setTimeout(function(){alert("Hello " + a)}, 2000);
a = "Stack Overflow";

Но если вы запустите этот код, вы заметите, что через 2 секунды всплывающее окно скажет «Hello Stack Overflow». Это связано с тем, что значение переменной a изменилось за эти две секунды. Чтобы через два секунды он сказал «Hello world», вам нужно использовать следующий фрагмент кода:

function callback(a){
    return function(){
        alert("Hello " + a);
    }
}
var a = "world";
setTimeout(callback(a), 2000);
a = "Stack Overflow";

Он будет ждать 2 секунды, а затем всплывет «Hello world».

175 голосов
/ 24 августа 2008

Есть следующее:

setTimeout(function, milliseconds);

функция, которой можно передать время, по истечении которого функция будет выполнена.

См .: Окно setTimeout() Метод .

33 голосов
/ 24 августа 2008

Просто, чтобы немного расширить ... Вы можете выполнить код непосредственно в вызове setTimeout, но, как говорит @ patrick , вы обычно назначаете функцию обратного вызова, как это. Время составляет миллисекунды

setTimeout(func, 4000);
function func() {
    alert('Do stuff here');
}
25 голосов
/ 30 июня 2014

Если вы действительно хотите иметь блокирующую (синхронную) функцию delay (для чего бы то ни было), почему бы не сделать что-то подобное:

<script type="text/javascript">
    function delay(ms) {
        var cur_d = new Date();
        var cur_ticks = cur_d.getTime();
        var ms_passed = 0;
        while(ms_passed < ms) {
            var d = new Date();  // Possible memory leak?
            var ticks = d.getTime();
            ms_passed = ticks - cur_ticks;
            // d = null;  // Prevent memory leak?
        }
    }

    alert("2 sec delay")
    delay(2000);
    alert("done ... 500 ms delay")
    delay(500);
    alert("done");
</script>
14 голосов
/ 24 августа 2008

Вам необходимо использовать setTimeout и передать ему функцию обратного вызова. Причина, по которой вы не можете использовать sleep в javascript, заключается в том, что вы заблокируете всю страницу от каких-либо действий в это время. Не хороший план. Используйте модель событий Javascript и будьте счастливы. Не борись с этим!

13 голосов
/ 24 августа 2008

Вы также можете использовать window.setInterval () для повторного запуска некоторого кода с регулярным интервалом.

10 голосов
/ 09 января 2012

Чтобы добавить более ранние комментарии, я хотел бы сказать следующее:

Функция setTimeout() в JavaScript не приостанавливает выполнение скрипта как такового, а просто указывает компилятору выполнить код в будущем.

В JavaScript нет функции, которая могла бы приостановить выполнение. Тем не менее, вы можете написать свою собственную функцию, которая выполняет что-то вроде безусловного цикла, пока не будет достигнуто время, используя функцию Date() и добавляя нужный интервал времени.

9 голосов
/ 20 декабря 2014

Если вам нужно только проверить задержку, вы можете использовать это:

function delay(ms) {
   ms += new Date().getTime();
   while (new Date() < ms){}
}

И затем, если вы хотите отложить на 2 секунды, вы делаете:

delay(2000);

Может быть, не самый лучший для производства. Подробнее об этом в комментариях

3 голосов
/ 22 января 2017

Простой ответ:

setTimeout(
    function () {
        x = 1;
    }, 1000);

Приведенная выше функция ждет 1 секунду (1000 мс), а затем устанавливает x в 1. Очевидно, это пример; Вы можете делать все что угодно внутри анонимной функции.

3 голосов
/ 16 января 2017

почему вы не можете поместить код в обещание? (напечатано с макушки головы)

new Promise(function(resolve, reject) {
  setTimeout(resolve, 2000);
}).then(function() {
  console.log('do whatever you wanted to hold off on');
});
...