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

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

Ответы [ 14 ]

2 голосов
/ 10 ноября 2017

Мне очень понравилось объяснение Мауриуса (ответ с наибольшим количеством голосов) с тремя различными методами вызова setTimeout.

В моем коде я хочу автоматически перейти к предыдущей странице после завершения события сохранения AJAX. Завершение события сохранения имеет небольшую анимацию в CSS, указывающую на успешное сохранение.

В моем коде я обнаружил разницу между первыми двумя примерами:

setTimeout(window.history.back(), 3000);

Этот не ждет времени ожидания - функция back () вызывается почти сразу, независимо от того, какое число я ввел для задержки.

Однако, изменив это на:

setTimeout(function() {window.history.back()}, 3000);

Это именно то, на что я надеялся.

Это не относится к операции back (), то же самое происходит с alert(). В основном с alert(), использованным в первом случае, время задержки игнорируется. Когда я закрываю всплывающее окно, анимация для CSS продолжается.

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

0 голосов
/ 03 февраля 2019

Самое простое решение для вызова вашей функции с задержкой:

function executeWithDelay(anotherFunction) {
    setTimeout(anotherFunction, delayInMilliseconds);
}
0 голосов
/ 21 июля 2018

Как уже говорилось, setTimeout - ваша самая безопасная ставка
Но иногда вы не можете отделить логику от новой функции, тогда вы можете использовать Date.now (), чтобы получить миллисекунды и сделать задержку самостоятельно ....

function delay(milisecondDelay) {
   milisecondDelay += Date.now();
   while(Date.now() < milisecondDelay){}
}

alert('Ill be back in 5 sec after you click ok....');
delay(5000);
alert('im back ' +new Date());
0 голосов
/ 05 февраля 2016

У меня было несколько команд ajax, которые я хотел запустить с задержкой между ними. Вот простой пример того, как это сделать. Я готов быть разорванным в клочья, хотя для моего нетрадиционного подхода. :)

//  Show current seconds and milliseconds
//  (I know there are other ways, I was aiming for minimal code
//  and fixed width.)
function secs()
{
    var s = Date.now() + ""; s = s.substr(s.length - 5);
  return s.substr(0, 2) + "." + s.substr(2);
}

//  Log we're loading
console.log("Loading: " + secs());

//  Create a list of commands to execute
var cmds = 
[
    function() { console.log("A: " + secs()); },
    function() { console.log("B: " + secs()); },
    function() { console.log("C: " + secs()); },
    function() { console.log("D: " + secs()); },
    function() { console.log("E: " + secs()); },
  function() { console.log("done: " + secs()); }
];

//  Run each command with a second delay in between
var ms = 1000;
cmds.forEach(function(cmd, i)
{
    setTimeout(cmd, ms * i);
});

// Log we've loaded (probably logged before first command)
console.log("Loaded: " + secs());

Вы можете скопировать блок кода и вставить его в окно консоли и увидеть что-то вроде:

Loading: 03.077
Loaded: 03.078
A: 03.079
B: 04.075
C: 05.075
D: 06.075
E: 07.076
done: 08.076
...