Сведения о вопросе

1234123213

21:28, 11th August, 2020

Теги

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

Просмотров: 446   Ответов: 14

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



  Сведения об ответе

PAGE

06:24, 29th August, 2020

Просто чтобы добавить к тому, что все остальные говорили о 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 секунды всплывающее окно скажет "Привет переполнение стека". Это происходит потому, что значение переменной a изменилось за эти две секунды. Чтобы заставить его произнести 'Hello world' через две секунды, вам нужно использовать следующий фрагмент кода:

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

Он будет ждать 2 секунды, а затем всплывающее окно 'Hello world'.


  Сведения об ответе

SILA

08:51, 11th August, 2020

Существует следующее:

setTimeout(function, milliseconds);

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

Смотрите: Метод Window setTimeout() .


  Сведения об ответе

DINO

11:15, 11th August, 2020

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

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


  Сведения об ответе

SEEYOU

13:39, 12th August, 2020

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


  Сведения об ответе

pumpa

16:08, 1st August, 2020

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


  Сведения об ответе

davran

20:51, 14th August, 2020

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


  Сведения об ответе

piter

14:04, 5th August, 2020

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

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

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


  Сведения об ответе

lats

14:39, 28th August, 2020

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

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

И тогда если вы хотите задержаться на 2 секунды вы это сделаете:

delay(2000);

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


  Сведения об ответе

SKY

15:19, 10th August, 2020

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

new Promise(function(resolve, reject) {

  setTimeout(resolve, 2000);

}).then(function() {

  console.log('do whatever you wanted to hold off on');

});


  Сведения об ответе

dumai

03:12, 17th August, 2020

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

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

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


  Сведения об ответе

$DOLLAR

12:30, 15th August, 2020

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

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

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

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

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

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

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

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

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

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


  Сведения об ответе

lesha

18:36, 26th August, 2020

У меня было несколько команд 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


  Сведения об ответе

KOMP

16:59, 12th August, 2020

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

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


  Сведения об ответе

PIRLO

02:41, 19th August, 2020

Как сказал другой, 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());


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться