Ответы:
Есть следующее:
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());