Javascript'te senkron ve asenkron fonksiyonlar vardır.
Senkron Fonksiyonlar
Javascript'teki işlevlerin çoğu eşzamanlıdır. Arka arkaya birkaç eşzamanlı işlevi çağırırsanız
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
sırayla infaz edecekler. tamamlanıncaya doSomethingElse
kadar başlamaz doSomething
. doSomethingUsefulThisTime
, sırayla, doSomethingElse
tamamlanana kadar başlamaz .
Asenkron Fonksiyonlar
Ancak asenkron işlev birbirini beklemez. Bu sefer fonksiyonların eşzamansız olduğunu varsayarsak, yukarıdaki kod örneğine bakalım
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
İşlevler sırayla başlatılır, ancak hepsi kabaca aynı anda yürütülür. Hangisinin önce biteceğini sürekli olarak tahmin edemezsiniz: yürütmek için en kısa sürenin gerçekleşmesi önce biter.
Ancak bazen, eşzamansız olan işlevlerin sırayla yürütülmesini ve bazen eşzamanlı işlevlerin eşzamansız olarak yürütülmesini istersiniz. Neyse ki, bu sırasıyla geri aramalar ve zaman aşımları ile mümkündür.
Callbacks
Diyelim biz sırayla çalıştırmak istiyorum, o üç asenkron işlevlere sahip olduğunu varsayalım some_3secs_function
, some_5secs_function
ve some_8secs_function
.
İşlevler Javascript'te bağımsız değişken olarak iletilebildiğinden, işlev tamamlandıktan sonra yürütmek için bir işlevi geri arama olarak iletebilirsiniz.
Eğer böyle fonksiyonlar yaratırsak
function some_3secs_function(value, callback){
//do stuff
callback();
}
sonra sırayla şöyle çağırabilirsiniz:
some_3secs_function(some_value, function() {
some_5secs_function(other_value, function() {
some_8secs_function(third_value, function() {
//All three functions have completed, in order.
});
});
});
Zaman aşımları
Javascript'te, bir işlevin belirli bir zaman aşımından sonra (milisaniye cinsinden) yürütülmesini söyleyebilirsiniz. Bu aslında senkron fonksiyonların asenkron olarak davranmasını sağlayabilir.
Üç senkron fonksiyonumuz varsa, setTimeout
fonksiyonu kullanarak bunları senkronize olmayan bir şekilde çalıştırabiliriz .
setTimeout(doSomething, 10);
setTimeout(doSomethingElse, 10);
setTimeout(doSomethingUsefulThisTime, 10);
Ancak bu biraz çirkin ve KURU prensibini [wikipedia] ihlal ediyor . Bir dizi işlevi ve bir zaman aşımını kabul eden bir işlev oluşturarak bunu biraz temizleyebiliriz.
function executeAsynchronously(functions, timeout) {
for(var i = 0; i < functions.length; i++) {
setTimeout(functions[i], timeout);
}
}
Bu şu şekilde adlandırılabilir:
executeAsynchronously(
[doSomething, doSomethingElse, doSomethingUsefulThisTime], 10);
Özet olarak, eşzamanlı olarak yürütmek istediğiniz eşzamansız işlevleriniz varsa geri çağrıları kullanın ve eşzamansız olarak yürütmek istediğiniz eşzamanlı işlevleriniz varsa zaman aşımlarını kullanın.