Javascript kodu geri çağrıları kullanırken nasıl eşzamansız hale geliyor?


26

Eşzamansız JavaScript kodu yazmayı anlamaya çalışarak çok fazla çevrimiçi okuma yapıyorum. Araştırmamda çok fazla öne çıkan tekniklerden biri geri arama kullanmak. Bir geri çağırma işlevi yazma ve yürütme sürecini anladığım halde, geri çağrıların neden JavaScript çalıştırmasını eşzamansız hale getirdiğini görünce kafam karıştı. Öyleyse sorum şu: geri arama işlevlerini JavaScript koduma ekleme işlevi, söz konusu kodu otomatik olarak nasıl eşzamansız hale getiriyor?


2
Tarayıcının bunu, John Resig
Jalayn

@Jalayn. Teşekkürler. Yorumunuz birkaç cevabı okuduktan sonra tüm farkı yarattı.
kushalvm

Yanıtlar:


26

Öyle değil. Sadece bir geri arama almak veya bir geri aramayı geçmek, zaman uyumsuz olduğu anlamına gelmez.

Örneğin, .forEachişlev bir geri arama alır ancak senkronizedir.

var available = false;
[1,2,3].forEach( function(){
    available = true;
});
//code here runs after the whole .forEach has run,
//so available === true here

setTimeoutDe bir geri arama alır ve asenkron olduğunu.

function myFunction( fn ) {
    setTimeout( function() {
        fn(1,2,3);
    }, 0 );
}

var available = false;
myFunction( function() {
    available = true;
});
//available is never true here

Javascript'teki herhangi bir zaman uyumsuz olaya bağlanmak her zaman bir geri çağrı gerektirir, ancak bu, çağrı işlevlerinin ya da etrafından dolaşmanın her zaman zamanuyumsuz olduğu anlamına gelmez.


2
@SteveEvers MDN makalesini daha sonra düzenleyebileceğinizi düşünüyorum . Geri arama, javascript'te verdiğiniz işlevi kullanarak sizi geri çağıran başka bir işlev için geçen herhangi bir işlev için çok yaygın kullanılan bir terimdir. Düzenleme: Geri arama özelliklerinde
Esailija

3
@SteveEvers "callback zaman uyumsuzluğunu ima eder" bir C # / Microsoft idiosyncrasy'dir. en.wikipedia.org/wiki/Callback_(computer_programming)
Esailija

1
@MikeBrown Ben onun profiline çok fazla okudum sanırım ve bu - en çok oy alan cevap kesinlikle "geri aramaların eşzamansızlık olduğu anlamına geliyor" fikrini veriyor.
Esailija

1
Fakat @SteveEvers'in söylenmesi de yanlıştır. Geri aramalar zaman uyumsuzluğu anlamına gelmez, yalnızca "geri arama" dan başkasının sorumlu olacağı anlamına gelir.
Michael Brown

1
+1 çünkü Steve Evers yanılıyor
slebetman

23

"Sihir" in sırrı , geri aramaları atadığınız olayların eşzamansız olmasıdır. Arka planda, JS sanal alanının dışında ne yapıyorlarsa (uzaktaki bir sunucudan bir şey almak gibi) ne yapmak istediklerine bakmak için "kaputun altında" uygulanırlar. Ve sonra işleri bittikten sonra, JS motoruna bir olayı çağırması için bir mesaj verdiler. JS motoru şu anda ne yapıyorsa bittiğinde, sıraya alınmış olan herhangi bir olayı arayacak (ya da yeni bir mesaj bekleyecektir) ve daha sonra geri çağırma işleminiz "sihirli bir şekilde" asenkronize!

( NOT: Bu, ayrıntılara girmeyen konuyla ilgili çok yüksek, kavramsal bir bakış açısıdır, çünkü farklı JS motorları işleri farklı şekillerde uygulayacaklardır.


Bunlar hangi olaylar? Bir ya da iki olayın bir örneği, cevabınızı daha da iyi yapacaktır.
Jo Smo,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.