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 yaparlar...
Asenkron setTimeout() Fonksiyonu Ve Senkronizasyon
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 php'deki callback mantığına uygun olarak 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...
Yayınlanma Tarihi: 09 Haziran 2010 Çarşamba - 13:56
Anahtar Kelimeler: setTimeout(), senkron, asenkron, synchronous, call, çağrı, fonksiyonu, rekürsiyon, javascript, bitmesini beklemek
Yorumlar ( 2 )
Armağan can#1
29/10/2011, 14:48
ö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#2
29/10/2011, 18:17
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.
Yorum/Görüş Bildir