Best Studio 1
Best Studio
mannaxxx 1
mannaxxx
Agora Metin2 1
Agora Metin2
[DEV]AB 1
[DEV]AB
Sevdamsın 1
Sevdamsın
TuZaKK 1
TuZaKK
kaptanmikro1 1
kaptanmikro1
farkmt2official 2
farkmt2official
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Bvural41 1
Bvural41
Hikaye Ekle

[NODE JS] setTimeout ve setInterval Kullanimi

Türkiye'de ilk Mobil & PC Aynı Anda Metin2 Oyna. Triarchonline kalıcı ve uzun ömürlü yapısı ile 24 Temmuz'da açılıyor. | 1-99 Mobil Metin2 Triarch HEMEN TIKLA!

nodejs.png


[NODE JS] setTimeout ve setInterval Kullanimi​


Selam arkadaslar, bugun zamanlayicilari detayli inceleyecegiz. setTimeout ve setInterval, JavaScript'in en temel asenkron araclaridir ama dogru kullanilmadiginda ciddi sorunlara yol acabilir. Ben kariyerimde setInterval ile memory leak'e neden olan, setTimeout ile zamanlama sorunlari yasayan bir cok kod gordum. Simdi bu fonksiyonlari dogru kullanmayi ogrenelim.

setTimeout ile Gecikmeli Calisma​


setTimeout bir fonksiyonu belirtilen milisaniye sonra bir kez calistirir. Ama dikkat edin, belirtilen sure minimum beklenme suresidir, tam olarak o anda calisacaginin garantisi yoktur. Eger Event Loop baska islerle mesgulse, callback biraz daha gec calisabilir. Bu ozellikle 0ms timeout icin de gecerlidir, hemen calismaz, mevcut senkron kodun bitmesini bekler.

JavaScript:
// setTimeout temel kullanim
console.log('Baslangic');

// 1 saniye sonra calisir
setTimeout(() => {
    console.log('1 saniye gecti');
}, 1000);

// 0ms timeout bile hemen calismaz
setTimeout(() => {
    console.log('Bu senkron koddan sonra calisir');
}, 0);

console.log('Bu once yazilir');

// Parametreli setTimeout
function bilgiGoster(ad, yas) {
    console.log(`\n${ad}, ${yas} yasinda`);
}

setTimeout(bilgiGoster, 500, 'Ahmet', 28);

// setTimeout'u iptal etme
const zamanlayici = setTimeout(() => {
    console.log('Bu calismayacak');
}, 5000);

clearTimeout(zamanlayici);
console.log('Zamanlayici iptal edildi');

// Gecikme fonksiyonu (Promise bazli)
function bekle(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function siraliIslem() {
    console.log('\n=== Sirali Islem ===');
    console.log('Adim 1');
    await bekle(500);
    console.log('Adim 2 (500ms sonra)');
    await bekle(300);
    console.log('Adim 3 (300ms sonra)');
}

siraliIslem();

setInterval ile Tekrarlayan Islemler​


setInterval bir fonksiyonu belirtilen aralikla tekrar tekrar calistirir. Ama burada onemli bir incelik var: interval suresi, bir onceki calismanin bitmesiyle baslamaz, ilk cagriyla baslar. Yani islem 2 saniye suruyorsa ve interval 3 saniyeyse, islemler arasinda sadece 1 saniye bos kalir. Islem 4 saniye suruyorsa, islemler ust uste binebilir. Bu yuzden uzun suren islemlerde setInterval yerine recursive setTimeout tercih edin.

JavaScript:
// setInterval temel kullanim
let sayac = 0;
const interval = setInterval(() => {
    sayac++;
    console.log(`Tick ${sayac}`);

    if (sayac >= 5) {
        clearInterval(interval);
        console.log('Interval durduruldu');
    }
}, 1000);

// Sorun: setInterval islem suresini hesaba katmaz
// Cozum: Recursive setTimeout
async function guvenliTekrar(fn, aralik) {
    while (true) {
        const baslangic = Date.now();
        await fn();
        const sure = Date.now() - baslangic;

        // Islem suresini cikararak dogru araligi hesapla
        const bekleme = Math.max(0, aralik - sure);
        await new Promise(resolve => setTimeout(resolve, bekleme));
    }
}

// Health checker ornegi
class HealthChecker {
    constructor(hedefler, aralikMs = 5000) {
        this.hedefler = hedefler;
        this.aralikMs = aralikMs;
        this.zamanlayici = null;
        this.calisiyor = false;
    }

    baslat() {
        if (this.calisiyor) return;
        this.calisiyor = true;
        console.log('\nHealth checker baslatildi');
        this._kontrol();
    }

    async _kontrol() {
        if (!this.calisiyor) return;

        const sonuclar = await Promise.allSettled(
            this.hedefler.map(h => this._ping(h))
        );

        const zaman = new Date().toLocaleTimeString('tr-TR');
        console.log(`\n[${zaman}] Health Check Sonuclari:`);

        sonuclar.forEach((s, i) => {
            const hedef = this.hedefler[i];
            const durum = s.status === 'fulfilled' ? 'AKTIF' : 'PASIF';
            console.log(`  ${hedef.ad}: ${durum}`);
        });

        // Recursive setTimeout kullan
        this.zamanlayici = setTimeout(() => this._kontrol(), this.aralikMs);
    }

    _ping(hedef) {
        return new Promise((resolve, reject) => {
            const sure = Math.random() * 200;
            setTimeout(() => {
                if (Math.random() > 0.2) resolve(true);
                else reject(new Error('timeout'));
            }, sure);
        });
    }

    durdur() {
        this.calisiyor = false;
        if (this.zamanlayici) {
            clearTimeout(this.zamanlayici);
        }
        console.log('Health checker durduruldu');
    }
}

// Kullanim
const checker = new HealthChecker([
    { ad: 'API Sunucusu', url: 'http://api.example.com' },
    { ad: 'Veritabani', url: 'http://db.example.com' },
    { ad: 'Redis', url: 'http://redis.example.com' }
], 3000);

checker.baslat();

// 10 saniye sonra durdur
setTimeout(() => checker.durdur(), 10000);

Timer Referanslari ve unref​


Node.js'te bir timer aktif oldugu surece process ayakta kalir. Eger sadece bir timer kaldiysa ve process'in kapanmasini istiyorsaniz, unref() metodunu kullanabilirsiniz. Bu metod, timer'in process'i ayakta tutmasini engeller. Ben bunu genelde opsiyonel arka plan gorevleri icin kullaniyorum.

Tecrubeme gore en yaygin zamanlayici hatalari sunlar: clearInterval/clearTimeout'u unutmak (memory leak), setInterval icinde async islem calistirmak (ust uste binme), zamanlayici referansini kaybetmek (iptal edememe) ve 0ms'yi "hemen" sanmak. Bu hatalardan kacinin ve zamanlayicilari her zaman temizleyin. Ozellikle sunucu uygulamalarinda temizlik yapmamak zamanla ciddi memory leak'e yol acar. Neyse, simdiki konumuza geciyoruz arkadaslar!
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst