Yanıtlar:
Aşağıdakiler var:
setTimeout(function, milliseconds);
işlevin yürütüleceği süreden sonra iletilebilen işlev.
Bakınız: Pencere setTimeout()
Yöntemi .
function_reference
siz eklemezseniz bu hemen yürütülmez ()
. Yani function_reference
sadece bu - bir referans; içeri aktarma function_reference()
işlevi derhal çağırır.
Sadece herkesin söylediklerine eklemek için setTimeout
: Gelecekte parametreyle bir işlevi çağırmak istiyorsanız, bazı anonim işlev çağrıları ayarlamanız gerekir.
Daha sonra çağrılabilmesi için işlevi bağımsız değişken olarak geçirmeniz gerekir. Aslında bu, adın arkasında parantez olmadan anlamına gelir. Aşağıdaki uyarıyı bir kerede arayacak ve 'Merhaba dünya' gösterecektir:
var a = "world";
setTimeout(alert("Hello " + a), 2000);
Bunu düzeltmek için bir fonksiyonun adını (Flubba'nın yaptığı gibi) koyabilir veya anonim bir fonksiyon kullanabilirsiniz. Bir parametre iletmeniz gerekiyorsa, anonim bir işlev kullanmanız gerekir.
var a = "world";
setTimeout(function(){alert("Hello " + a)}, 2000);
a = "Stack Overflow";
Ancak bu kodu çalıştırırsanız, 2 saniye sonra pop-up pencerenin 'Merhaba Yığın Taşması' diyeceğini göreceksiniz. Bunun nedeni, a değişkeninin değerinin bu iki saniyede değişmesidir. İki saniye sonra 'Merhaba dünya' demesini sağlamak için aşağıdaki kod snippet'ini kullanmanız gerekir:
function callback(a){
return function(){
alert("Hello " + a);
}
}
var a = "world";
setTimeout(callback(a), 2000);
a = "Stack Overflow";
2 saniye bekleyip 'Merhaba dünya' açılır.
Sadece biraz genişletmek için ... Doğrudan setTimeout
çağrıda kod yürütebilirsiniz , ancak @patrick'in söylediği gibi, normalde böyle bir geri çağırma işlevi atarsınız. Zaman milisaniyedir
setTimeout(func, 4000);
function func() {
alert('Do stuff here');
}
Gerçekten delay
(ne olursa olsun) bir engelleme (senkron) işlevine sahip olmak istiyorsanız , neden böyle bir şey yapmıyorsunuz:
<script type="text/javascript">
function delay(ms) {
var cur_d = new Date();
var cur_ticks = cur_d.getTime();
var ms_passed = 0;
while(ms_passed < ms) {
var d = new Date(); // Possible memory leak?
var ticks = d.getTime();
ms_passed = ticks - cur_ticks;
// d = null; // Prevent memory leak?
}
}
alert("2 sec delay")
delay(2000);
alert("done ... 500 ms delay")
delay(500);
alert("done");
</script>
delay
( bu soruyu cevaplamak için ) ing önce yenilemek, böylece iş parçacığı kilitlemez bir sürümünü istiyorum . Bunu yapmanın bir yolu var mı?
SetTimeout'u kullanmanız ve bir geri arama işlevi iletmeniz gerekir . Javascript'te uykuyu kullanamamanızın nedeni, bu arada tüm sayfanın herhangi bir şey yapmasını engellemenizdir. İyi bir plan değil. Javascript'in etkinlik modelini kullanın ve mutlu kalın. Kavga etme!
Bazı kodları düzenli aralıklarla art arda çalıştırmak için window.setInterval () öğesini de kullanabilirsiniz .
setTimeout()
bir kez setInterval()
yapar, tekrar tekrar yapar. Kodunuzun her 5 saniyede bir çalışmasını istiyorsanız,setInterval()
, iş için yapılır.
Önceki yorumları eklemek için aşağıdakileri söylemek istiyorum:
setTimeout()
JavaScript işlevi kendi başına script yürütmeye ara ama sadece gelecekte kod Eninde yürütmek için derleyici söyler etmez.
JavaScript'te yerleşik olarak yürütmeyi duraklatabilecek bir işlev yoktur. Ancak, işlevi kullanarak Date()
ve ihtiyacınız olan zaman aralığını ekleyerek, koşulsuz döngü gibi bir şeyi yapan zamana ulaşana kadar kendi işlevinizi yazabilirsiniz .
Yalnızca bir gecikmeyi test etmeniz gerekiyorsa bunu kullanabilirsiniz:
function delay(ms) {
ms += new Date().getTime();
while (new Date() < ms){}
}
Ve sonra 2 saniye geciktirmek istiyorsanız:
delay(2000);
Yine de üretim için en iyi olmayabilir. Yorumlarda daha fazlası
kodu neden bir vaadin arkasına koyamıyorsun? (başımın üst kısmına yazılmıştır)
new Promise(function(resolve, reject) {
setTimeout(resolve, 2000);
}).then(function() {
console.log('do whatever you wanted to hold off on');
});
Arama için üç farklı yöntemle Maurius'un açıklamasını (en yüksek oylanan yanıt) gerçekten beğendim setTimeout
.
Kodumda bir AJAX kaydetme olayı tamamlandıktan sonra otomatik olarak önceki sayfaya otomatik olarak gitmek istiyorum. Kaydetme etkinliğinin tamamlanması, CSS'de kaydetmenin başarılı olduğunu gösteren hafif bir animasyon içerir.
Kodumda ilk iki örnek arasında bir fark buldum:
setTimeout(window.history.back(), 3000);
Bu zaman aşımını beklemez - gecikme için hangi sayıya girersem vereyim neredeyse arka () hemen çağrılır.
Ancak bunu şu şekilde değiştirin:
setTimeout(function() {window.history.back()}, 3000);
Tam da umduğum şeyi yapıyor.
Bu, back () işlemine özgü değildir, aynı şey gerçekleşir alert()
. Temel olarak alert()
ilk durumda kullanılanlarla, gecikme süresi göz ardı edilir. Açılır pencereyi kapattığımda CSS için animasyon devam ediyor.
Bu nedenle, yerleşik işlevler kullanıyor ve bağımsız değişkenler kullanmasanız bile, açıkladığı ikinci veya üçüncü yöntemi öneririm.
Arada bir gecikmeyle çalıştırmak istediğim bazı ajax komutlarım vardı. İşte bunu yapmanın bir yolunun basit bir örneği. Alışılmadık yaklaşımım için parçalara ayrılmaya hazırım. :)
// Show current seconds and milliseconds
// (I know there are other ways, I was aiming for minimal code
// and fixed width.)
function secs()
{
var s = Date.now() + ""; s = s.substr(s.length - 5);
return s.substr(0, 2) + "." + s.substr(2);
}
// Log we're loading
console.log("Loading: " + secs());
// Create a list of commands to execute
var cmds =
[
function() { console.log("A: " + secs()); },
function() { console.log("B: " + secs()); },
function() { console.log("C: " + secs()); },
function() { console.log("D: " + secs()); },
function() { console.log("E: " + secs()); },
function() { console.log("done: " + secs()); }
];
// Run each command with a second delay in between
var ms = 1000;
cmds.forEach(function(cmd, i)
{
setTimeout(cmd, ms * i);
});
// Log we've loaded (probably logged before first command)
console.log("Loaded: " + secs());
Kod bloğunu kopyalayıp bir konsol penceresine yapıştırabilir ve şöyle bir şey görebilirsiniz:
Loading: 03.077
Loaded: 03.078
A: 03.079
B: 04.075
C: 05.075
D: 06.075
E: 07.076
done: 08.076
gecikme fonksiyonu:
/**
* delay or pause for some time
* @param {number} t - time (ms)
* @return {Promise<*>}
*/
const delay = async t => new Promise(resolve => setTimeout(resolve, t));
iç async
fonksiyon kullanımı :
await delay(1000);
Diğerleri gibi, setTimeout sizin için en güvenli bahistir
Ancak bazen mantığı yeni bir işleve ayıramazsınız, sonra milisaniye almak ve gecikmeyi kendiniz yapmak için Date.now () kullanabilirsiniz ....
function delay(milisecondDelay) {
milisecondDelay += Date.now();
while(Date.now() < milisecondDelay){}
}
alert('Ill be back in 5 sec after you click OK....');
delay(5000);
alert('# Im back # date:' +new Date());