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.