jQuery: ожидание / задержка 1 секунду без выполнения кода

Я не могу заставить метод .delay работать в jQuery:

$.delay(3000); // not working
$(queue).delay(3000); // not working

Я использую цикл while, чтобы дождаться, пока неконтролируемое изменяющееся значение не станет больше или равно другому, и я не могу найти способ вызвать выполнение в течение X секунд.


person Brian Graham    schedule 17.01.2012    source источник
comment
попробуйте использовать setTimeout в обратном вызове   -  person theshadowmonkey    schedule 17.01.2012
comment
какую версию jquery вы используете?   -  person L7ColWinters    schedule 17.01.2012
comment
это не то, для чего предназначена функция задержки, она предназначена для использования между событиями jquery в очереди (например, fade (). delay (). show ()). Вам нужна функция setTimeOut.   -  person JoJa    schedule 17.01.2012
comment
@JoJa: Вы правы в главном, однако форма без аргументов show (и hide) не использует очередь эффектов.   -  person Jay Tomten    schedule 17.01.2012
comment
Пожалуйста, укажите, чего вы пытаетесь достичь с задержкой. Весь JavaScript выполняется в одном потоке, и его замораживание на X секунд может вызвать неблагоприятные условия для пользователя.   -  person Dmitry Shkuropatsky    schedule 17.01.2012


Ответы (10)


$ .delay используется для задержки анимации в очереди, а не для остановки выполнения.

Вместо использования цикла while вам нужно рекурсивно вызвать метод, который выполняет проверку каждую секунду, используя setTimeout:

var check = function(){
    if(condition){
        // run when condition is met
    }
    else {
        setTimeout(check, 1000); // check again in a second
    }
}

check();
person Justin Niessner    schedule 17.01.2012
comment
Думаю, setTimeout достаточно. - person Jiemurat; 28.10.2013
comment
Ты бомба, братан, это именно то, что мне нужно, чтобы исправить мой код. - person jemiloii; 19.02.2014
comment
@Jiemurat и кто-либо еще в будущем: setTimeout не нарушает поток выполнения. Великий кодекс Нисснера получить это до тех пор, пока условия не стали реальностью! - person Gabrer; 05.12.2014
comment
Если вам не нужно прерывать поток выполнения, вы можете просто использовать setTimeout(). - person Joshua Pinter; 10.01.2015
comment
Я всегда получаю чек - это не функция, хотя у моей функции проверки есть два параметра - person Black; 14.03.2016
comment
Если вы хотите, чтобы ваш код работал, как только условие будет выполнено, setTimeout(check,0); - person reverie_ss; 31.05.2019

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

setTimeout(function (){

  // Something you want delayed.

}, 5000); // How long do you want the delay to be (in milliseconds)? 
person Matt Sich    schedule 21.07.2012
comment
Просто к вашему сведению, это не нарушает поток выполнения, поэтому, если вам нужно остановить все на несколько секунд, вам понадобится что-то вроде того, что опубликовал Нисснер. - person Joshua Pinter; 10.01.2015
comment
Да ... это обратный вызов функции и не блокирует. Спасибо за ответ, моя проблема решена. - person Bertus Kruger; 02.05.2015
comment
если частота очень мала и мы ожидаем, что эта функция будет работать вечно, не взорвет ли она стек? - person Suicide Bunny; 18.09.2018

ES6 setTimeout

setTimeout(() => {
  console.log("we waited 204586560000 ms to run this code, oh boy wowwoowee!");
}, 204586560000);

Изменить: 204586560000 мс - приблизительное время между исходным вопросом и этим ответом ... при условии, что я правильно рассчитал.

person thedanotto    schedule 12.07.2018
comment
действительно приятно использовать приблизительное время от исходного вопроса до этого ответа - person Fuzzybear; 30.11.2018

Функция delay jQuery предназначена для использования с эффектами и очередями эффектов, см. delay docs и приведенный в них пример. :

$('#foo').slideUp(300).delay(800).fadeIn(400);

Если вы хотите наблюдать за изменениями переменной, вы можете сделать что-то вроде

(function() {
    var observerInterval = setInterval(function() {
        if (/* check for changes here */) {
           clearInterval(observerInterval);
           // do something here
        }
    }, 1000);
})();
person Julian D.    schedule 17.01.2012
comment
У setInterval есть второй обязательный параметр, время в миллисекундах;) - person sara_thepot; 12.10.2015
comment
Спасибо @ sara.potyscki, исправлено. - person Julian D.; 12.10.2015
comment
@JulianD. Спасибо за это предложение. Я столкнулся с этим вопросом, пока искал решение. Это именно то, что мне нужно для моего проекта. - person Cheryl Velez; 22.09.2017

Если вы используете функции ES6 и используете асинхронную функцию, вы можете эффективно остановить выполнение кода на определенное время с помощью этой функции:

const delay = millis => new Promise((resolve, reject) => {
  setTimeout(_ => resolve(), millis)
});

Вот как вы его используете:

await delay(5000);

Он остановится на запрошенное количество миллисекунд, но только если вы используете асинхронную функцию. Пример ниже:

const myFunction = async function() {
  // first code block ...

  await delay(5000);

  // some more code, executed 5 seconds after the first code block finishes
}
person Anthony De Smet    schedule 08.04.2020
comment
Я решил эту проблему аналогичным образом в асинхронной функции, просто выполнив следующие действия: await setTimeout(_ => {}, millis); затем перейдя к следующей строке. - person Chantelle Chan; 17.08.2020

JavaScript setTimeout - очень хорошее решение:

function funcx()
   {
   // your code here
   // break out here if needed
   setTimeout(funcx, 3000);
   }

funcx();

Функция delay в jQuery в основном используется для задержки анимации в очереди анимации jQuery.

person Jay Tomten    schedule 17.01.2012

delay() не останавливает поток кода, а затем повторно запускает его. В JavaScript нет практического способа сделать это. Все должно быть выполнено с помощью функций, которые принимают обратные вызовы, такие как setTimeout, о которых упоминали другие.

Цель delay() jQuery - заставить очередь анимации ждать перед выполнением. Так, например, $(element).delay(3000).fadeIn(250); заставит элемент исчезнуть через 3 секунды.

person Nathan MacInnes    schedule 17.01.2012

Javascript - это асинхронный язык программирования, поэтому вы не можете остановить выполнение на какое-то время; единственный способ [псевдо] остановить выполнение - использовать setTimeout (), который не является задержкой, а является «отложенным обратным вызовом функции».

person Fabio Buda    schedule 17.01.2012

Только javascript Работает без jQuery

<!DOCTYPE html>
<html>
    <head>
        <script>
            function sleep(miliseconds) {
                var currentTime = new Date().getTime();
                while (currentTime + miliseconds >= new Date().getTime()) {
                }
            }

            function hello() {
                sleep(5000);
                alert('Hello');
            }
            function hi() {
                sleep(10000);
                alert('Hi');
            }
        </script>
    </head>
    <body>
        <a href="#" onclick="hello();">Say me hello after 5 seconds </a>
        <br>
        <a href="#" onclick="hi();">Say me hi after 10 seconds </a>


    </body>
</html>
person Faruk Omar    schedule 10.03.2016
comment
Цикл ожидания в javascript - плохая идея! Все функции javascript будут остановлены во время выполнения цикла. Это будет иметь непредвиденные побочные эффекты. Намного лучше использовать неблокирующие функции, такие как setTimeout (). - person Kevin G.; 12.07.2016

function sleep(num) {
    var now = new Date();
    var stop = now.getTime() + num;
    while(true) {
        now = new Date();
        if(now.getTime() > stop) return;
    }
}

sleep(1000);   // 1 second 
alert('here');

этот код хорошо работает для меня.

person donkey    schedule 24.02.2021
comment
Пожалуйста, предоставьте некоторую информацию об ответе, чтобы будущие читатели могли получить больше информации из вашего ответа. - person Not A Bot; 24.02.2021