Tanım
"Eşzamansız" terimi, biraz farklı anlamlarda kullanılabilir ve aslında burada olmasa da, görünüşte çelişkili cevaplara neden olur. Asynchrony'deki Wikipedia bu tanıma sahiptir:
Asenkron, bilgisayar programlamasında, ana program akışından bağımsız olayların meydana gelmesini ve bu olaylarla başa çıkma yollarını ifade eder. Bunlar, sinyallerin gelişi gibi "dış" olaylar veya programın sonuçları ile beklemek için engellemeden program yürütme ile eşzamanlı olarak gerçekleştirilen bir program tarafından başlatılan eylemler olabilir.
JavaScript olmayan kod, bu tür "dış" etkinlikleri JavaScript'in bazı etkinlik kuyruklarına sıralayabilir. Ama bu kadarıyla gidiyor.
Önleme Yok
Komut dosyanızda başka bir JavaScript kodu çalıştırmak için JavaScript kodunu çalıştırmanın harici bir kesintisi yoktur . JavaScript parçaları birbiri ardına yürütülür ve sıra, her olay kuyruğundaki olayların sırasına ve bu sıraların önceliğine göre belirlenir.
Örneğin, aşağıdaki kod parçası yürütülürken başka hiçbir JavaScript'in (aynı komut dosyasında) yürütülmeyeceğinden kesinlikle emin olabilirsiniz:
let a = [1, 4, 15, 7, 2];
let sum = 0;
for (let i = 0; i < a.length; i++) {
sum += a[i];
}
Başka bir deyişle, JavaScript'te herhangi bir önleme yoktur . Olay kuyruklarında ne olursa olsun, bu olayların işlenmesi, bu tür bir kod tamamlanıncaya kadar beklemek zorunda kalacaktır. EcmaScript spesifikasyonu 8.4 İşler ve İşler Kuyrukları bölümünde söylüyor :
Bir İşin yürütülmesi, yalnızca çalışan yürütme bağlamı olmadığında ve yürütme bağlamı yığını boş olduğunda başlatılabilir.
Asenkronize Örnekler
Diğerlerinin zaten yazdığı gibi, JavaScript'te eşzamansızlığın oynatıldığı birkaç durum vardır ve her zaman yalnızca başka bir JavaScript kodu yürütülmediğinde JavaScript yürütülmesine neden olabilecek bir olay kuyruğu içerir:
setTimeout()
: aracı (örn. tarayıcı) zaman aşımı süresi dolduğunda bir olay kuyruğuna bir olay koyacaktır. Zamanın izlenmesi ve olayın kuyruğa yerleştirilmesi, JavaScript olmayan bir kodla gerçekleşir ve bu nedenle, bunun bazı JavaScript kodlarının yürütülmesine paralel olduğunu hayal edebilirsiniz. Ancak, sağlanan geri arama setTimeout
yalnızca şu anda yürütülen JavaScript kodu tamamlandığında ve uygun olay kuyruğu okunduğunda yürütülebilir.
fetch()
: aracı, bir HTTP isteği gerçekleştirmek ve gelen yanıtları izlemek için OS işlevlerini kullanır. Yine bu JavaScript dışı görev, halen yürütülmekte olan bazı JavaScript kodlarıyla paralel olarak çalışabilir. Ancak, iade edilen sözü çözecek olan vaat çözüm prosedürü, fetch()
yalnızca şu anda yürütülen JavaScript tamamlanınca çalıştırılabilir.
requestAnimationFrame()
: bir boyama işlemi gerçekleştirmeye hazır olduğunda tarayıcının oluşturma motoru (JavaScript olmayan) JavaScript kuyruğuna bir etkinlik yerleştirir. JavaScript olayı işlendiğinde geri arama işlevi yürütülür.
queueMicrotask()
: hemen mikro görev kuyruğuna bir olay yerleştirir. Geri arama, çağrı yığını boş olduğunda ve o olay tüketildiğinde yürütülür.
Daha birçok örnek var, ancak tüm bu işlevler ana EcmaScript tarafından değil, ana bilgisayar ortamı tarafından sağlanır. Temel EcmaScript ile, bir etkinliği Promise İş Kuyruğuna eşzamanlı olarak yerleştirebilirsiniz Promise.resolve()
.
Dil Yapıları
ECMAscript gibi asenkroni desen desteklemek için çeşitli dil yapıları sağlar yield
, async
, await
. Ancak hata olmamasına izin verin: JavaScript kodu harici bir etkinlik tarafından kesilmez . Sağlanan yield
ve await
sağladığı gibi görünen "kesinti", bir işlev çağrısından geri dönmenin ve daha sonra JS koduyla (durumunda yield
) veya olay kuyruğuyla ( await
).
DOM olay işleme
JavaScript kodu DOM API'sine eriştiğinde, bu bazı durumlarda DOM API'sının bir veya daha fazla senkronize bildirimi tetiklemesine neden olabilir. Kodunuzda bunu dinleyen bir olay işleyicisi varsa çağrılır.
Bu, önleyici eşzamanlılık olarak karşımıza çıkabilir, ancak değildir: olay işleyicileriniz geri döndüğünde, DOM API sonunda geri döner ve orijinal JavaScript kodu devam eder.
Diğer durumlarda DOM API, uygun olay kuyruğunda bir olay gönderir ve çağrı yığını boşaltıldığında JavaScript olayı alır.
Bkz senkron ve asenkron olaylar