JavaScript tek bir iş parçacığında çalıştığından, bir AJAX isteği yapıldıktan sonra arka planda gerçekte ne olur? Bununla ilgili daha derin bir fikir edinmek istiyorum, kimse biraz ışık tutabilir mi?
JavaScript tek bir iş parçacığında çalıştığından, bir AJAX isteği yapıldıktan sonra arka planda gerçekte ne olur? Bununla ilgili daha derin bir fikir edinmek istiyorum, kimse biraz ışık tutabilir mi?
Yanıtlar:
Kapakların altında, javascript bir olay kuyruğuna sahiptir. Bir javascript yürütme iş parçacığı her bittiğinde, kuyrukta işlenecek başka bir olay olup olmadığını kontrol eder. Varsa, kuyruğu çeker ve o olayı tetikler (örneğin fare tıklaması gibi).
Ajax çağrısının altında bulunan yerel kod ağı, ajax yanıtının ne zaman yapıldığını bilecek ve javascript olay kuyruğuna bir olay eklenecektir. Ajax çağrısının ne zaman yapıldığını yerel kodun nasıl bilmesi uygulamaya bağlıdır. İş parçacıklarıyla uygulanabilir veya olay tarafından da başlatılabilir (gerçekten önemli değildir). Uygulamanın amacı, ajax yanıtı yapıldığında, bazı yerel kodların yapıldığını bilecek ve JS kuyruğuna bir olay koyacağıdır.
O anda hiçbir Javascript çalışmıyorsa, olay hemen tetiklenecek ve ajax yanıt işleyicisini çalıştıracaktır. O sırada bir şey çalışıyorsa, geçerli javascript yürütme iş parçacığı tamamlandığında olay işlenir. Javascript motoru tarafından herhangi bir yoklamaya gerek yoktur. Bir Javascript parçası yürütmeyi tamamladığında, JS motoru yalnızca olay kuyruğunu kontrol ederek çalıştırılması gereken başka bir şey olup olmadığını kontrol eder. Öyleyse, bir sonraki olayı kuyruktan çıkar ve yürütür (bu olay için kaydedilmiş bir veya daha fazla geri çağırma işlevini çağırır). Olay kuyruğunda hiçbir şey yoksa, JS yorumlayıcısının bir dış ajan olay kuyruğuna başka bir şey koyup tekrar uyandırıncaya kadar boş zamanı vardır (çöp toplama veya boşta).
Dışarıdaki tüm olaylar olay kuyruğundan geçtiğinden ve javascript aslında başka bir şey çalıştırırken hiçbir olay tetiklenmediğinden, tek iş parçacıklı kalır.
İşte detaylarla ilgili bazı makaleler:
.focus()
Bir öğeyi çağırırsınız ve bu, öğeye odaklanılan "bulanıklaştırma" olayı gibi birkaç etkinliği tetikler. Bu bulanıklık olayı eşzamanlı olarak gerçekleşir ve olay kuyruğundan geçmez, böylece olay kuyruğunda olabilecek diğer şeylerden hemen önce olur. Uygulamada, bunu hiç pratik bir endişe olarak görmedim.
Burada javascript'te olayların işlenmesi ile ilgili çok eksiksiz bir belge bulabilirsiniz .
Opera Tarayıcı'da javascript uygulaması üzerinde çalışan bir adam tarafından yazılmıştır.
Daha kesin olarak şu başlıklara bakın: "Olay Akışı", "Olay Sırası" ve "Kullanıcı Olmayan Olaylar": şunları öğreneceksiniz:
Not: Orijinal link: link , ama şimdi öldü.
Cevaplarda belirtilen ajax uygulaması ile ilgili biraz ayrıntı vermek istiyorum.
(Düzenli) JavaScript yürütme olmasına rağmen değil yukarıdaki cevapları iyice belirtildiği gibi - - çok kanallı Ancak , gerçek kullanım AJAX responses
(yanı sıra istek işleme) 'dir değil JavaScript, ve - genellikle - olan çok kanallı. ( yukarıda tartışacağımız XMLHttpRequest'in krom kaynağı uygulamasına bakın )
ve açıklayacağım, şu kodu alalım:
var xhr = new XMLHttpRequest();
var t = Date.now;
xhr.open( "GET", "https://swx.cdn.skype.com/shared/v/1.2.15/SkypeBootstrap.min.js?v="+t(), true );
xhr.onload = function( e ) {
console.log(t() + ': step 3');
alert(this.response.substr(0,20));
};
console.log(t() + ': step 1');
xhr.send();
console.log(t() + ': step 2');
after an AJAX request is made
(- 1. adımdan sonra), sonra js kodunuz yürütülmeye devam ederken (2. adım ve sonrası), tarayıcı gerçek çalışmayı başlatır: 1. bir tcp isteğini biçimlendirme 2. bir soket açma 3. gönderme başlıkları 4. el sıkışma 5. gönderme gövde 6. bekleme yanıtı 7. okuma başlıkları 8. okuma gövdesi vb. tüm bu uygulama genellikle js kodu yürütme paralel olarak farklı bir iş parçacığında çalışır. bir örnek için, bahsedilen krom uygulaması, Threadable Loader go digg-into 😉 kullanır (sayfa yükünün ağ sekmesine bakarak da biraz izlenim edinebilirsiniz, bazı eşzamanlı istekler görürsünüz).
Sonuç olarak, en azından G / Ç işlemlerinizin çoğunun eşzamanlı / eşzamansız yapılabileceğini söyleyebilirim (ve bunun için örneğin bir beklemeden yararlanabilirsiniz ). ancak bu işlemlerle (veren, js geri arama yürütme) tüm etkileşimlerin tümü eşzamanlıdır.