Выполнить скрипт после определенной задержки с использованием JavaScript

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
193
0
458 285
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

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

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

rushinge 02.01.2013 23:15

@rushinge затем установите обратный вызов для отправки формы и отключите отправку формы по умолчанию

Populus 02.07.2013 22:56
Ответ принят как подходящий

Это следующее:

setTimeout(function, milliseconds);

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

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

Это не выражение, которое выполняется, это функция. Ответ @Marius иллюстрирует это.

pedrofurla 27.10.2012 07:45

это не задержка, это вилка. Задержка должна работать в том же потоке.

DragonLord 01.11.2012 00:09

Это немедленно выполнит function_reference. Чтобы «работать» (асинхронно), это должно быть указано как: setTimeout (function () {MethodToCall ();}, 1000);

Bernoulli IT 17.11.2014 22:39

Я хочу отметить, что мы говорим о JavaScript; вызов «потоков» или то, что он должен работать «синхронно», может быть истинным технически и семантически, но на самом деле не вписывается в контекст JavaScript, учитывая, что на самом деле нет способа добиться задержки с помощью любого из этих методов (вы не t создавать «потоки» в JS, как в других языках). Кроме того, это не приведет к немедленному выполнению function_reference, если вы не включите (). Т.е. function_reference - это всего лишь ссылка; передача function_reference() вызовет функцию немедленно.

Danny Bullis 24.11.2015 03:04

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

setInterval () не следует использовать, вместо этого следует использовать setTimeout

paul 04.01.2011 03:58

setTimeout() делает это один раз, setInterval() делает это неоднократно. Если вы хотите, чтобы ваш код запускался каждые 5 секунд, setInterval() создан для этой работы.

rcoup 08.06.2011 06:26

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

setTimeout(func, 4000);
function func() {
    alert('Do stuff here');
}

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

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

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

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

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

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

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

Он подождет 2 секунды, а затем появится всплывающее окно «Hello world».

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

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

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

Если вы действительно хотите иметь блокирующую (синхронную) функцию 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>

Сложность этого решения заключается в том, что оно активно использует процессор, что приводит к увеличению энергопотребления и уменьшению ресурсов, доступных для других потоков / процессов (например, других вкладок, других программ). Сон, напротив, временно приостанавливает использование системными ресурсами потоком.

ramcdougal 01.07.2014 10:13

лучше использовать Date.now () вместо new Date () и не думать об утечках памяти

WayFarer 04.12.2014 15:26

Конечно, это интенсивно загружает процессор, но для быстрого и грязного тестирования работает.

Maris B. 25.03.2015 12:21

Более компактная процедура: задержка функции (мс) {var start_time = Date.now (); while (Date.now () - время_пуска

Duke 18.03.2016 09:46

;(function(){function a(b,a){!0!==a&&(b*=1E3);for(var c=Date.now();Date.now()-c<b;);}window.hasOwnProperty("delay"‌​)||(window.delay=a)}‌​)(); Используйте секунды или миллисекунды. Пример с 3 секундами: delay(3); Пример с 500 миллисекундами: delay(500, true);

SpYk3HH 12.07.2016 00:47

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

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

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

delay(2000);

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

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

Ry- 20.12.2014 04:34

@ U2744SNOWFLAKE Имеет смысл. Обновили ответ, для чего я использовал эту функцию :)

Christoffer 20.12.2014 12:33

Достаточно хорошо работает в разработке для быстрого и грязного (и временного) решения.

HumanInDisguise 28.04.2015 18:59

У меня было несколько команд 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.info("Loading: " + secs());

//  Create a list of commands to execute
var cmds = 
[
    function() { console.info("A: " + secs()); },
    function() { console.info("B: " + secs()); },
    function() { console.info("C: " + secs()); },
    function() { console.info("D: " + secs()); },
    function() { console.info("E: " + secs()); },
  function() { console.info("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.info("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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как уже говорилось, 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());

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

function executeWithDelay(anotherFunction) {
    setTimeout(anotherFunction, delayInMilliseconds);
}

функция задержки:

/**
 * 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);

Другие вопросы по теме