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.


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();

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)? 

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.


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);
})();

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.


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.


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
}

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”.


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>

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.,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.