jQuery: Wait / Delay 1 sekundę bez wykonywania kodu

129

Nie mogę uzyskać .delaymetody działającej w jQuery:

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

Używam pętli while, aby czekać, aż niekontrolowana zmieniająca się wartość będzie większa lub równa innej i nie mogę znaleźć sposobu na zatrzymanie wykonania przez X sekund.

Brian Graham
źródło
spróbuj użyć setTimeout w wywołaniu zwrotnym
theshadowmonkey
jakiej wersji jquery używasz?
L7ColWinters
1
nie do tego została zaprojektowana funkcja delay, jest ona przeznaczona do użytku pomiędzy kolejkowanymi zdarzeniami jquery (takimi jak fade (). delay (). show ()). Potrzebujesz funkcji setTimeOut.
JoJa
@JoJa: Masz rację w głównym punkcie, jednak bez argumentów w formie show (i hide) nie używa się kolejki efektów.
Jay Tomten,
3
Proszę, powiedz, co chcesz osiągnąć z opóźnieniem. Cały JavaScript jest wykonywany w jednym wątku, a zawieszenie go na X sekund może spowodować niekorzystne wrażenia użytkownika.
Dmitry Shkuropatsky

Odpowiedzi:

177

$ .delay służy do opóźniania animacji w kolejce, a nie do zatrzymywania wykonywania.

Zamiast używać pętli while, musisz rekurencyjnie wywołać metodę, która wykonuje sprawdzenie co sekundę, używając setTimeout:

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

check();
Justin Niessner
źródło
1
Myślę, że wystarczy setTimeout.
Jiemurat
3
Twój bomba, to jest dokładnie to, czego potrzebowałem, aby naprawić mój kod.
jemiloii
@Jiemurat i wszyscy w przyszłości: setTimeout nie przerywa przepływu wykonywania. Wspaniały kod Niessnera sprawi, że warunki się spełnią!
Gabrer
Jeśli nie musisz przerywać przepływu wykonywania, możesz po prostu użyć setTimeout().
Joshua Pinter
Zawsze dostaję „check is not a function”, moja funkcja check ma jednak dwa parametry
Black
218

Możesz także opóźnić niektóre operacje w ten sposób:

setTimeout(function (){

  // Something you want delayed.

}, 5000); // How long do you want the delay to be (in milliseconds)? 
Matt Sich
źródło
7
Tylko do Twojej wiadomości, to nie przerywa przepływu wykonania, więc jeśli chcesz "zatrzymać wszystko" na kilka sekund, będziesz potrzebować czegoś takiego, co opublikował Niessner.
Joshua Pinter
Tak ... jest to wywołanie zwrotne do funkcji i nie blokuje. Dzięki za odpowiedź, to rozwiązało mój problem.
Bertus Kruger
jeśli częstotliwość jest bardzo mała i spodziewamy się, że ta funkcja będzie działać wiecznie, czy w końcu rozwali stos?
Suicide Bunny
20

ES6 setTimeout

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

Edycja: 204586560000 ms to przybliżony czas między oryginalnym pytaniem a tą odpowiedzią ... zakładając, że obliczyłem poprawnie.

thedanotto
źródło
3
naprawdę fajnie, używając przybliżonego czasu od oryginalnego pytania do tej odpowiedzi
Fuzzybear
9

delayFunkcja jQuery ma być używana z efektami i kolejkami efektów, zobacz delaydokumentację i przykład w niej:

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

Jeśli chcesz obserwować zmienną pod kątem zmian, możesz zrobić coś takiego

(function() {
    var observerInterval = setInterval(function() {
        if (/* check for changes here */) {
           clearInterval(observerInterval);
           // do something here
        }
    }, 1000);
})();
Julian D.
źródło
setInterval ma drugi obowiązkowy parametr, czas w milisekundach;)
sara_thepot
1
Dzięki @ sara.potyscki, naprawione.
Julian D.
@JulianD. Dziękuję za tę sugestię. Wylądowałem na tym pytaniu, szukając rozwiązania w Google. Właśnie tego potrzebowałem do mojego projektu.
Cheryl Velez
8

JavaScript setTimeoutto bardzo dobre rozwiązanie:

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

funcx();

delayFunkcja jQuery jest stosowany głównie do opóźniania animacji w kolejce animacji jQuery.

Jay Tomten
źródło
5

delay()nie zatrzymuje przepływu kodu, a następnie uruchamia go ponownie. Nie ma praktycznego sposobu na zrobienie tego w JavaScript. Wszystko musi być zrobione z funkcjami, które przyjmują wywołania zwrotne, o setTimeoutktórych wspominali inni.

Celem jQuery delay()jest, aby kolejka animacji czekała przed wykonaniem. Na przykład $(element).delay(3000).fadeIn(250);sprawi, że element zniknie po 3 sekundach.

Nathan MacInnes
źródło
5

Jeśli korzystasz z funkcji ES6 i korzystasz z funkcji asynchronicznej, możesz skutecznie zatrzymać wykonywanie kodu na określony czas za pomocą tej funkcji:

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

Oto jak tego używasz:

await delay(5000);

Zatrzyma się na żądaną liczbę milisekund, ale tylko wtedy, gdy jesteś w funkcji asynchronicznej . Przykład poniżej:

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

  await delay(5000);

  // some more code, executed 5 seconds after the first code block finishes
}
Anthony De Smet
źródło
1
Rozwiązałem ten problem w podobny sposób w funkcji asynchronicznej, wykonując po prostu następujące czynności: await setTimeout(_ => {}, millis);a następnie przechodząc do następnej linii.
Chantelle Chan
4

Javascript jest asynchronicznym językiem programowania, więc nie można zatrzymać wykonywania przez pewien czas; jedynym sposobem na [pseudo] zatrzymanie wykonania jest użycie setTimeout (), które nie jest opóźnieniem, ale „opóźnionym wywołaniem zwrotnym funkcji”.

Fabio Buda
źródło
4

Tylko javascript Będzie działać bez 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>
Faruk Omar
źródło
1
Zapętlenie czekania w javascript to zły pomysł! Wszystkie funkcje javascript zostaną zatrzymane podczas działania pętli. Będzie to miało nieprzewidziane skutki uboczne. O wiele lepiej jest używać funkcji nieblokujących, takich jak setTimeout ().
Kevin G.,