Bir bilgisayar mühendisi için programlama dili, öğrendiklerini sınadığı, deneyler yaptığı bir laboratuardır ve mühendisler deneylerini, kestiremedikleri sonuçları gözlemlemek için değil, öngördükleri sonuçları doğrulamak için yapar...

Asenkron setTimeout() Fonksiyonu Ve Senkronizasyon

Normalde asenkron olan setTimeout() fonksiyonunun istenen kod parçalarıyla senkron biçimde çalışması sağlanabilir.

setTimeout() fonksiyonu genelde istenen süre kadar geciktirme sağlamak amacıyla tekrar tekrar çağrılır. Ancak bu fonksiyon script ile birlikte senkron bir biçimde çalışmaz. Çağrıldığında kendi başına görevine devam ederken, scriptin geri kalan kısmının işletilmesi, fonksiyonun işini tamamlaması beklenmeden sürdürülür.

Javascriptin en çok hoşuma giden özelliklerinden biri phpde olduğu gibi değişkenlerin tipleri ile uğraştırmaması. Bir değişken tanımladığınızda o değişkene bir fonksiyonun adresi dahil istediğiniz tipte değerler atabiliyorsunuz. Bu sayede setTimeout() fonksiyonunun, scriptin geri kalan kısmı ile doğrudan senkronizasyonu sağlanamasa bile fonksiyon tamamlandığında bir script parçasının yürütülmesi sağlanabilir:

function gerisay(kactayim,bitince)
{
    document.title=kactayim
    if(kactayim>0) setTimeout(function(){ gerisay(--kactayim,bitince) }, 1000)
    else bitince()
}

gerisay(5,function(){ alert('Bitti!') } )

Yukarıdaki örnekte fonksiyon kendisine verilen değerden sıfıra kadar sayar ve sayım bittiğinde aldığı geriçağırım (callback) parametresiyle belirtilen fonksiyonu çağırır. Rekürsif olarak çağrılan 'gerisay' fonksiyonlarından en sonuncusu hariç tümü 'bitince' parametresi için sadece taşıyıcılık görevi üstlenmiştir. Bu dolaylı rekürsif çağrı zincirinin en son halkası olan fonksiyon ise kendisine sadakatle ulaştırılan 'bitince' parametresinin işaret ettiği fonksiyonu çalıştırmak ile görevlidir. Sonuçta bu rekürsif çağrılar sonunda fonksiyonun bitimi beklenmediği için senkron biçimde yürütülemeyen kodların yer aldığı fonksiyon çağrılarak, dolaylı olarak senkronizasyon sağlanmış olur...

Gereksiz olabilecek birkaç ayrıntıdan daha söz edelim. Örnekte yapılan hiçbir rekürsif çağrı bir diğeri ile senkron değildir. Çünkü başlatma çağrısı niteliğindeki ilk çağrı hariç tüm çağrılar asenkron bir fonksiyon olan setTimeout() fonksiyonu tarafından yapılmaktadır. Klasik rekürsiyon mantığına göre her çağrılan fonksiyon, kendi çağırdığı fonksiyonun bitmesini bekler ve son fonksiyon başta olmak üzere tüm fonksiyonlar sırayla sonlanır. Oysa burada setTimeout() fonksiyonunu çağıran her fonksiyon, sonuç beklemeden sonlanır. Dolayısıyla yığına fazlaca yüklenme veya yığını taşırma söz konusu değildir. Bu tam olarak rekürsiyon sayılmayabilir, bu duruma dolaylı rekürsiyon diyebiliriz...

Sayfayı
Yayın tarihi: 09 Haziran 2010 Çarşamba, 13:56
Anahtar kelimeler: settimeout, javascript

Yorum Gönder

 
Yorumunuzu -1. yoruma yanıt olarak gönderiyorsunuz. Yanıtlamayı iptal etmek için buraya tıklayabilirsiniz.

 

Yorumlar (2)

Armağan can
Yanıtla
29 Ekim 2011 Cumartesi, 14:48
#1

öncelikle güzel bir anlatım tebrik ediyorum.Ama şu rekürsif kelimesini anlamadım :) keşke herkesin anlayabielceği bir karşılığı olan kelimeyi kullanabilsek anlatımlarımızda.Diğer insanları bilemm ama benim bir anlatımdan ,eğitimden veya öğretimden vs.. soğumamın tek sebebi bilmediğim ve çok itici gelen kelimeler olmuştur :) psikolojik olabilir ama insanlara bir şeyleri öğretmeye çalışıyorsak bunu kolaya indirgeyerek yapmak en güzeli.Yinede merak edenlere yardımcı oldugunuz ıcın teşekkur ederım.Çalışmalarınızın devamını diler başarılar dilerim.

Hüseyin Atasoy
Yanıtla
29 Ekim 2011 Cumartesi, 18:17
#2

Merhaba,
Bu konuda haklısınız, fakat bazı kelimelerin direkt Türkçe karşılığını bulmak kolay olmuyor. Kalıplaşmış bazı kelimeler var ve biz de bu kelimeleri aynen alıp kullanılıyoruz. Örneğin "rekürsif" kelimesi yerine kullanılan "özyinelemeli" kelimesinin kavramı tam karşıladığını düşünmüyorum...
Bu arada kendini kendi içinden çağıran fonksiyonlara rekürsif fonksiyon deniyor.

 
 
Sayfa 38 sorgu ile 0.008 saniyede oluşturuldu.
Atasoy Blog v4 © 2008-2017 Hüseyin Atasoy