Mehmet

WFN Üye
Konular
1,851
Mesajlar
1,852
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
setTimeout(), verdiğiniz bir fonksiyonu belirli bir süre geçtikten sonra çalıştırmak için kullanılan JavaScript zamanlayıcısıdır. Süre milisaniye cinsindendir; ancak bu süre, fonksiyonun tam o anda çalışacağı anlamına gelmez. JavaScript ana iş parçacığı meşgulse callback, iş parçacığı boşalınca çalışır.

Temel kullanım​


En küçük tam örnek şöyledir:

Kod:
console.log("Başladı");

const timerId = setTimeout(() => {
  console.log("Callback çalıştı");
}, 1000);

console.log("Zamanlayıcı kuruldu", timerId);

Çalıştırdığınızda önce Başladı, hemen ardından Zamanlayıcı kuruldu mesajını görürsünüz. Yaklaşık bir saniye sonra Callback çalıştı yazdırılır. setTimeout() beklerken JavaScript kodunun geri kalanını durdurmaz; bu nedenle çağrıdan sonraki console.log() daha önce çalışır.

Sürenin nasıl yorumlanacağı​


setTimeout(callback, 1000) ifadesindeki 1000, callback'in çalıştırılmasından önce beklenecek en kısa süreyi belirtir. Tarayıcıdaki başka JavaScript işlemleri, uzun süren bir event listener veya çağrı yığını doluysa callback daha geç çalışabilir. Bu yüzden setTimeout, hassas zaman ölçümü ya da kesin aralıklarla çalışan görevler için uygun değildir.

Sıfır gecikme bile eşzamanlı çağrı anlamına gelmez. Aşağıdaki bağımsız örnekte önce A ve C, daha sonra B yazılır:
JavaScript:
console.log("A");
setTimeout(() => console.log("B"), 0);
console.log("C");
Callback mevcut senkron kodun arasına girmez. Uzun bir iş varsa bu gecikmeyi büyütebilir; bunu göstermek için tarayıcıyı meşgul döngüyle dondurmak gerekmez.

İhtiyaçUygun yaklaşımNeden
Bir işlemi bir kez geciktirmeksetTimeoutTek seferlik callback çalıştırır
Bekleyen işlemi iptal etmeksetTimeout + clearTimeoutKullanıcı eylemi değiştiğinde zamanlayıcı durdurulabilir
Düzenli tekrar yapmaksetInterval veya kontrollü tekrarsetTimeout yalnızca bir kez çalışır
Kesin zaman ölçmekZaman ölçümüne uygun API ve tasarımsetTimeout gecikebilir


İptal etme ve değer aktarma​


Zamanlayıcıyı iptal etmek için setTimeout() tarafından döndürülen kimliği clearTimeout() ile kullanın:

Kod:
const timerId = setTimeout(() => {
  console.log("Bu mesaj yazdırılmayacak");
}, 2000);

clearTimeout(timerId);

Callback'e değer aktarmanın pratik yolu, değeri kapanım (closure) içinde kullanmaktır:

Kod:
const kullanici = "Deniz";

setTimeout(() => {
  console.log(`Merhaba ${kullanici}`);
}, 500);

Bir fonksiyonun sonucunu doğrudan vermek yaygın bir hatadır. setTimeout(console.log("Hazır"), 1000) yazarsanız console.log() hemen çalışır ve setTimeout() geçerli bir callback yerine dönüş değerini alır. Fonksiyonu çağırmadan aktarmalısınız:

Kod:
setTimeout(() => console.log("Hazır"), 1000);

Hangi durumda kullanılmalı?​


Karar verirken şu ayrımı kullanın:

Örneğin arama kutusunda kullanıcı her tuşa bastığında istek göndermek yerine kısa bir gecikme uygulamak istiyorsanız önceki zamanlayıcıyı iptal edip yenisini kurabilirsiniz:

Kod:
let timerId;

function aramayiGeciktir(metin) {
  clearTimeout(timerId);

  timerId = setTimeout(() => {
    console.log("Arama yapılıyor:", metin);
  }, 300);
}

aramayiGeciktir("jav");
aramayiGeciktir("javascript");

Bu örnekte arka arkaya yapılan çağrılardan yalnızca sonuncusunun callback'i çalışır. Bu desen debounce olarak kullanılır; gerçek ağ isteği eklenirse isteğin hata yönetimi ve iptali ayrıca ele alınmalıdır.

Sık yapılan hatalar​


  • Süreyi saniye sanmak: setTimeout(fn, 2) iki saniye değil, iki milisaniyelik minimum gecikme hedefler.
  • Callback yerine sonucu vermek: setTimeout(fn(), 1000) fonksiyonu hemen çağırır.
  • İptal kimliğini kaybetmek: clearTimeout() için dönen zamanlayıcı kimliğini saklayın.
  • Kesin çalışma zamanı beklemek: Ana iş parçacığı meşgulse callback gecikir.
  • setTimeout'u döngü sanmak: Bir kez çalışır; tekrar için açıkça yeni zamanlayıcı kurmak veya başka bir zamanlama yaklaşımı seçmek gerekir.

Sık sorulan sorular​

Arka sekmeye geçince zamanlayıcı neden çok gecikir?​

Tarayıcılar kaynak ve enerji kullanımını azaltmak için etkin olmayan sekmelerin zamanlayıcılarını yavaşlatabilir. Sınırlar tarayıcıya ve duruma göre değişir; belirli bir aralık garantisi vermeyin. Bildirim veya sunucu işi gibi kalıcı görevleri yalnız açık sekmedeki zamanlayıcıya bağlamayın.

clearTimeout çalışmakta olan callback’i yarıda keser mi?​

Hayır. Henüz başlamamış zamanlayıcıyı iptal etmek içindir. Callback zaten başladıysa onun senkron işlemini geri almaz; ayrıca başlattığı ağ isteğini de kendiliğinden iptal etmez. İptal edilebilir uzun bir iş gerekiyorsa alttaki işlemin desteklediği iptal mekanizmasını ve iş akışını ayrıca tasarlayın.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.