jQuery: Kodu yürütmeden 1 saniye bekleyin / Geciktirin


129

.delayJQuery'de çalışan yöntemi alamıyorum :

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

Kontrolsüz değişen bir değer diğerine eşit veya daha büyük olana kadar beklemek için bir while döngüsü kullanıyorum ve X saniye boyunca yürütmeyi gerçekleştirmenin bir yolunu bulamıyorum.


geri
— aramada

jquery'nin hangi sürümünü kullanıyorsunuz?
— L7ColWinters

1
Gecikme işlevinin tasarlandığı şey bu değildir, sıraya alınmış jquery olayları arasında kullanılmak üzere tasarlanmıştır (fade (). delay (). show () gibi). SetTimeOut işlevine ihtiyacınız var.
— JoJa

@JoJa: Ana noktada haklısınız, ancak gösterme (ve gizle) 'nin argümansız formu efektler kuyruğunu kullanmaz.
— Jay Tomten

3
Lütfen gecikmeyle neyi başarmaya çalıştığınızı belirtin. Tüm JavaScript, tek bir iş parçacığı üzerinde çalışır ve X saniye boyunca dondurulması, olumsuz kullanıcı deneyimine neden olabilir.
— Dmitry Shkuropatsky

Yanıtlar:


176

$ .delay, yürütmeyi durdurmak için değil, kuyruktaki animasyonları geciktirmek için kullanılır.

Bir while döngüsü kullanmak yerine, aşağıdakileri kullanarak her saniye denetimi gerçekleştiren bir yöntemi özyinelemeli olarak çağırmanız gerekir setTimeout:

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

check();

1
Sanırım setTimeout yeterli.
— Jiemurat

3
Senin bomba kardeşim, kodumu düzeltmek için ihtiyacım olan şey buydu.
— jemiloii

@Jiemurat ve gelecekte başkaları: setTimeout yürütme akışını bozmaz. Niessner'ın büyük kodu, koşullar gerçekleşene kadar bunu elde etti!
— Gabrer

Yürütme akışını kesmeniz gerekmiyorsa, kullanabilirsiniz setTimeout().
— Joshua Pinter

Her zaman "kontrol bir işlev değil"
— Kara

210

Ayrıca bazı işlemleri şu şekilde geciktirebilirsiniz:

setTimeout(function (){

  // Something you want delayed.

}, 5000); // How long do you want the delay to be (in milliseconds)? 

7
Bilginize, bu yürütme akışını bozmaz, bu nedenle birkaç saniyeliğine "her şeyi durdurmanız" gerekirse, Niessner'ın yayınladığı gibi bir şeye ihtiyacınız olacak.
— Joshua Pinter

Evet ... bu işlevin geri çağrılmasıdır ve engellemez. Cevap için teşekkürler, sorunumu çözdü.
— Bertus Kruger

frekans aşırı kısaysa ve bu fonksiyonun sonsuza kadar çalışmasını beklersek, sonunda yığını patlatır mı?
— İntihar Tavşan

16

ES6 setTimeout

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

Düzenleme: 204586560000 ms, doğru hesapladığımı varsayarsak, orijinal soru ile bu cevap arasındaki yaklaşık süredir.


2
orijinal sorudan bu cevaba kadar geçen yaklaşık süreyi kullanmak gerçekten güzel
— Fuzzybear

9

jQuery'nin delayişlevi, efektler ve efekt kuyruklarıyla kullanılmak üzere tasarlanmıştır, buradaki delaybelgelere ve örneğe bakın :

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

Değişiklikler için bir değişkeni gözlemlemek istiyorsanız, şöyle bir şey yapabilirsiniz:

(function() {
    var observerInterval = setInterval(function() {
        if (/* check for changes here */) {
           clearInterval(observerInterval);
           // do something here
        }
    }, 1000);
})();

setInterval'in ikinci bir zorunlu parametresi vardır, milisaniye cinsinden süre;)
— sara_thepot

1
Teşekkürler @ sara.potyscki, düzeltildi.
— Julian D.

@JulianD. Bu öneri için teşekkür ederim. Bir çözüm ararken bu soruya geldim. Projem için tam da ihtiyacım olan şey buydu.
— Cheryl Velez

8

JavaScript setTimeoutçok iyi bir çözüm:

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

funcx();

delayJQuery işlevinin çoğunlukla bir jQuery animasyon kuyruğunda animasyonlar geciktirilmesi için kullanılmaktadır.


5

delay()kod akışını durdurmaz ve ardından yeniden çalıştırmaz. Bunu JavaScript'te yapmanın pratik bir yolu yok. Her şeyin aşağıdaki gibi geri çağırmaları alan işlevlerle yapılması gerekir:setTimeout başkalarının bahsettiği .

JQuery'nin amacı, delay()çalıştırmadan önce bir animasyon kuyruğunu bekletmektir. Örneğin $(element).delay(3000).fadeIn(250);, elementin 3 saniye sonra kaybolmasını sağlayacaktır.


5

Sadece javascript jQuery olmadan çalışacak

<!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
JavaScript'te beklemek için döngü yapmak kötü bir fikirdir! Döngü çalışırken tüm javascript işlevleri duracaktır . Bunun beklenmeyen yan etkileri olacaktır. SetTimeout () gibi engellemeyen işlevleri kullanmak çok daha iyidir.
— Kevin G.

4

Javascript eşzamansız bir programlama dilidir, bu nedenle yürütmeyi bir süre durduramazsınız; Bir yürütmeyi [sözde] durdurmanın tek yolu, bir gecikme değil, "gecikmeli işlev geri araması" olan setTimeout () kullanmaktır.


2

ES6 özelliklerini kullanıyorsanız ve zaman uyumsuz bir işlev içindeyseniz, bu işlevle kod yürütmeyi belirli bir süre için etkili bir şekilde durdurabilirsiniz:

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

Bunu nasıl kullanıyorsun:

await delay(5000);

İstenen milisaniye miktarı için durur, ancak yalnızca zaman uyumsuz bir işlev içindeyseniz . Aşağıdaki örnek:

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

  await delay(5000);

  // some more code, executed 5 seconds after the first code block finishes
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.