Ответы:
Есть следующее:
setTimeout(function, milliseconds);
функция, которой можно передать время, после которого функция будет выполнена.
Смотрите: Метод окнаsetTimeout() .
function_referenceесли вы не включите (). Т.е. function_referenceпросто это - ссылка; передача function_reference()сразу вызовет функцию немедленно.
Просто чтобы добавить к тому, о чем все остальные говорили setTimeout: если вы хотите вызывать функцию с параметром в будущем, вам нужно настроить некоторые анонимные вызовы функций.
Вам нужно передать функцию в качестве аргумента, чтобы она вызывалась позже. По сути это означает без скобок за именем. Следующее вызовет оповещение сразу и отобразит «Hello world»:
var a = "world";
setTimeout(alert("Hello " + a), 2000);
Чтобы это исправить, вы можете указать имя функции (как это сделал Флубба) или использовать анонимную функцию. Если вам нужно передать параметр, то вы должны использовать анонимную функцию.
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 секунды, а затем всплывающее окно «Привет мир».
Если вы действительно хотите иметь блокирующую (синхронную) 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>
delayзагрузкой (чтобы ответить на этот вопрос ). Есть ли способ сделать это?
Вам нужно использовать setTimeout и передать ему функцию обратного вызова. Причина, по которой вы не можете использовать sleep в javascript, заключается в том, что вы заблокируете всю страницу от каких-либо действий в это время. Не хороший план. Используйте модель событий Javascript и будьте счастливы. Не борись с этим!
Вы также можете использовать window.setInterval () для повторного запуска некоторого кода через регулярные промежутки времени.
setTimeout()делает это один раз, setInterval()делает это несколько раз. Если вы хотите, чтобы ваш код запускался каждые 5 секунд, setInterval()это сделано для работы.
Чтобы добавить более ранние комментарии, я хотел бы сказать следующее:
setTimeout()Функция в JavaScript не приостанавливает выполнение сценария на себе, а лишь говорит компилятору , чтобы выполнить код когда - нибудь в будущем.
В JavaScript нет функции, которая может приостановить выполнение. Тем не менее, вы можете написать свою собственную функцию, которая выполняет что-то вроде безусловного цикла, пока не будет достигнуто время, используя Date()функцию и добавляя нужный интервал времени.
Если вам нужно только проверить задержку, вы можете использовать это:
function delay(ms) {
ms += new Date().getTime();
while (new Date() < ms){}
}
И затем, если вы хотите задержать на 2 секунды, вы делаете:
delay(2000);
Не может быть лучшим для производства, хотя. Подробнее об этом в комментариях
почему вы не можете поставить код за обещание? (напечатано на макушке)
new Promise(function(resolve, reject) {
setTimeout(resolve, 2000);
}).then(function() {
console.log('do whatever you wanted to hold off on');
});
Мне очень понравилось объяснение Мауриуса (самый высокий отклик) с тремя различными методами вызова setTimeout.
В моем коде я хочу автоматически переходить на предыдущую страницу после завершения события сохранения AJAX. Завершение события сохранения имеет небольшую анимацию в CSS, указывающую на успешное сохранение.
В моем коде я обнаружил разницу между первыми двумя примерами:
setTimeout(window.history.back(), 3000);
Этот не ждет тайм-аута - функция back () вызывается почти сразу, независимо от того, какой номер я вставил для задержки.
Однако, изменив это на:
setTimeout(function() {window.history.back()}, 3000);
Это именно то, что я надеялся.
Это не относится к операции back (), то же самое происходит с alert(). В основном с alert()использованием в первом случае время задержки игнорируется. Когда я закрываю всплывающее окно, анимация для CSS продолжается.
Таким образом, я бы рекомендовал второй или третий метод, который он описывает, даже если вы используете встроенные функции, а не аргументы.
У меня было несколько команд 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
функция задержки:
/**
* delay or pause for some time
* @param {number} t - time (ms)
* @return {Promise<*>}
*/
const delay = async t => new Promise(resolve => setTimeout(resolve, t));
использование внутри asyncфункции:
await delay(1000);
Как уже говорилось, 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 # date:' +new Date());