JavaScript arka planda AJAX yanıtlarını nasıl işler?


139

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?



3
JavaScript kodu tek iş parçacıklı (web çalışanları hariç), ancak JavaScript motorunu çalıştıran tarayıcı değil ...
Juan Mendes

@JuanMendes Olay Kuyruğu başka bir iş parçacığında çalışırken JavaScript bir iş parçacığında çalışıyor mu?
Shaun Luttin

1
@ShaunLuttin Hayır, etkinlik sırası JavaScript'i başlatan şey
Juan Mendes

Yanıtlar:


213

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:


Bunun için teşekkürler. Durumun bu olduğundan şüphelendim, ama kesin olarak bilmek iyi. Ben çok 'ajax' istekleri göndermek bir for döngüsü var. İşleyicimde (her istek için - rasgele sırayla döndürüldü) Biraz zaman alabilecek bir kod çalıştırıyorum. Bunun kesinlikle işe yarayacağını bilmek güzel.
iPadDeveloper2011

4
@ telandor - olaylar FIFO sırasına göre yürütülür (bazı son durum istisnaları olabilir, ancak amaç FIFO'dur). Bazı olaylar biraz farklı muamele görür. Örneğin, fareyle üzerine gelme olayları kuyrukta birikmez (muhtemelen kuyruğu kolayca taşabildikleri için). Fare hareket ettiğinde ve bir fareyle üzerine gelme olayı zaten kuyrukta olduğunda ve kuyrukta başka bir yeni olay olmadığında, yeni bir olay eklemek yerine en son konumla güncellenir. Aralık zamanlayıcı olaylarının muhtemelen kuyrukta birikmelerini önlemek için özel olarak tedavi edildiğini tahmin ediyorum.
jfriend00

2
@telandor - daha fazla ne açıklamanız gerekiyor? Bu FIFO. Cevabıma birkaç referans makalesi daha ekledim. FIFO'nun farkında olduğum tek infazları derhal tetiklenen olaylardır. .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.
jfriend00

2
@telandor - Tarayıcı belgesi başına birden fazla kuyruk yok. Bir kuyruk var ve her şey seri olarak FIFO içeri / dışarı gidiyor. Bu nedenle zaman aşımları ve ajax yanıtları ile fare olayları ve klavye olaylarının tümü aynı sıradadır. Hangisi sıraya konursa ilk önce koşar.
jfriend00

1
@CleanCrispCode - Thx. Cevabım için yararlı bir referans olarak ekledim.
jfriend00

16

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:

  1. Javascript, her tarayıcı sekmesi veya penceresi için tek bir iş parçacığında çalışır.
  2. Olaylar sıraya alınır ve sıraya alınır.
  3. XMLHttpRequest uygulama tarafından çalıştırılır ve geri çağrılar olay kuyruğu kullanılarak çalıştırılır.

Not: Orijinal link: link , ama şimdi öldü.


1

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.

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.