Bunun hakkında düşünüyorum ve bulduğum şey şu:
Aşağıdaki kodu görelim:
console.clear();
console.log("a");
setTimeout(function(){console.log("b");},1000);
console.log("c");
setTimeout(function(){console.log("d");},0);
Bir istek gelir ve JS motoru yukarıdaki kodu adım adım çalıştırmaya başlar. İlk iki çağrı senkron çağrılardır. Ancak setTimeout
yöntem söz konusu olduğunda , eşzamansız bir yürütme haline gelir. Ancak JS hemen ondan geri döner ve Non-Blocking
veya adı verilen çalıştırmaya devam eder Async
. Ve diğerleri üzerinde çalışmaya devam ediyor.
Bu uygulamanın sonuçları şu şekildedir:
ACDB
Yani temelde ikincisi setTimeout
ilk olarak bitirildi ve geri arama işlevi ilkinden daha erken yürütülüyor ve bu mantıklı.
Burada tek iş parçacıklı uygulamadan bahsediyoruz. JS Engine, bunu yürütmeye devam eder ve ilk isteği bitirmediği sürece ikinciye gitmez. Ancak iyi olan şey, çözülmek gibi engelleme işlemlerini beklemeyeceği için setTimeout
yeni gelen istekleri kabul ettiği için daha hızlı olacaktır.
Ancak sorularım şu maddeler etrafında ortaya çıkıyor:
# 1: Tek iş parçacıklı bir uygulamadan bahsediyorsak setTimeouts
, JS motoru daha fazla isteği kabul edip çalıştırırken hangi mekanizma işliyor? Tek iş parçacığı diğer istekler üzerinde nasıl çalışmaya devam ediyor? setTimeout
Diğer talepler gelip yerine getirilirken neler çalışıyor .
# 2: Daha setTimeout
fazla istek gelirken ve yürütülürken bu işlevler perde arkasında yürütülürse, perde arkasındaki eşzamansız yürütmeleri ne gerçekleştirir? Bu bahsettiğimiz şey nedir EventLoop
?
# 3: Ancak EventLoop
, her şeyin çalıştırılması ve geri çağırma yönteminin çağrılması için tüm yöntem yerleştirilmemeli mi? Geri arama işlevleri hakkında konuşurken anladığım şey bu:
function downloadFile(filePath, callback)
{
blah.downloadFile(filePath);
callback();
}
Ancak bu durumda, JS Engine, bir eşzamansız işlev olup olmadığını nasıl anlar, böylece geri aramayı EventLoop
? Belki de async
C #'daki anahtar kelime gibi bir şey veya JS Engine'in alacağı yöntemi gösteren bir tür öznitelik eşzamansız bir yöntemdir ve buna göre ele alınmalıdır.
4: Ancak bir makale , işlerin nasıl yürüdüğüne dair tahmin ettiğim şeyin tam tersini söylüyor:
Olay Döngüsü, geri arama işlevlerinin bir kuyruğudur. Eşzamansız bir işlev yürütüldüğünde, geri arama işlevi kuyruğa itilir. JavaScript motoru, eşzamansız bir işlevin ardından kod çalıştırılıncaya kadar olay döngüsünü işlemeye başlamaz.
# 5: Burada yardımcı olabilecek bir resim var ama resimdeki ilk açıklama 4. soruda bahsedilen şeyin aynısını söylüyor:
Yani buradaki sorum yukarıda listelenen maddeler hakkında bazı açıklamalar almak mı?