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.