Senkron ve Asenkron JavaScript'i anlama - Bölüm 1
Senkron ve eşzamanlı olmayan JavaScript'i, özellikle yeni başlayanlar için kafa karıştırıcı. İki veya daha fazla şey senkron onlar ne zaman aynı anda olmak (senkronize halde) ve Asenkron olmadıkları zaman (senkronize değil).
Her ne kadar bu tanımların kolayca anlaşılabilir olsa da aslında göründüğünden daha karmaşık. Dikkate almak gerekir tam olarak senkronize olan nedir, ve ne değil.
Muhtemelen bir normal
JavaScript'te işlev senkronize değil mi? Ve eğer böyle bir şeyse setTimeout ()
veya birlikte çalıştığınız AJAX’a eşzamansız olarak mı bakacaksınız? Ya bunu sana söylersem her ikisi de bir şekilde eşzamansız?
Açıklamak niye ya, yardım için Bay X'e dönmeliyiz.
Senaryo 1 - Bay X eşzamanlılığı deniyor
İşte kurulum:
- Bay X, zor soruları cevaplayabilen ve istenen herhangi bir görevi yerine getirebilen kişidir.
- Onunla iletişim kurmanın tek yolu telefon görüşmesi yapmak..
- Bay X'in bunu yapması için yardım istemek için ne tür bir sorunuz veya göreviniz varsa; onu ara.
- Bay X size cevap verir veya görevi tamamlar derhal, ve bilmeni sağlar bitti.
- Alıcıyı içerik hissi bıraktın ve bir film için dışarı çıktın.
Az önce yaptığınız şey bir senkron (ileri geri) iletişim Bay X ile birlikte sorunuzu sorduğunu ve siz cevap verirken dinlediniz..
Senaryo 2 - Bay X eşzamanlılıktan memnun değil
Bay X çok verimli olduğu için daha fazla çağrı almaya başladı. Peki onu aradığınızda ne olur ama O zaten meşgul başka biriyle mi konuşuyorsun? Ona sorunuzu soramazsınız - aramanızı almak için özgür olana kadar. Tek duyacağınız meşgul bir ton.
Peki, Bay X bununla savaşmak için ne yapabilir??
Doğrudan arama yapmak yerine:
- Bay X yeni bir adam işe alır, Bay M ve arayanlar için ona bir telesekreter verir. mesaj bırakmak.
- Bay M’nin işi mesaj iletmek Telesekreterden Bay X'e, Bay X'in önceki tüm mesajları işlemeyi tamamladığını bildiği zaman yeni bir tane almakta özgür.
- Şimdi onu aradığınızda, yoğun bir ton almak yerine, Bay X için bir mesaj bıraktınız. seni aramasını bekle (henüz film zamanı yok).
- Bay X, sizinkinden önce aldığı tüm sıraya alınmış mesajlarla işini bitirdikten sonra, konunuza bakacak ve seni geri aramak sana cevap vermek.
Şimdi burada soru yatıyor: Şimdiye kadarki eylemlerdi senkron veya asenkron?
Karışık. Mesajını bıraktığın zaman, Bay X bunu dinlemiyordu, bu yüzden dördüncü iletişim asenkrondi..
Ama cevap verdiğinde, orada dinliyordun, hangi dönüş iletişimini senkronize eder.
Umarım, şimdiye kadar eşzamanlılığın iletişim açısından nasıl algılandığına dair daha iyi bir anlayış kazanmışsınızdır. JavaScript'i getirme zamanı.
JavaScript - Bir Eşzamansız Programlama Dili
Biri JavaScript’i eşzamansız olarak etiketlediğinde, genel olarak ne kastediyorsunuz? mesaj bırakın bunun için ve aramanız engellenmedi yoğun bir tonla.
İşlev çağrıları JavaScript’e asla yönlendirmeyin, kelimenin tam anlamıyla yapıldılar mesaj yoluyla.
JavaScript bir kullanır mesaj sırası gelen mesajların (veya olayların) yapıldığı yer. bir Olay döngü (bir mesaj gönderici) bu mesajları sırasıyla bir mesaja gönderir. çağrı yığını mesajların karşılık gelen işlevleri çerçeve olarak yığılmış (işlev tartışmaları ve değişkenler) yürütme için.
Çağrı yığını çağrılan ilk işlevin çerçevesini ve çağrılan işlevler için diğer çerçeveleri tutar. iç içe aramalar yoluyla üstünde .
Bir mesaj kuyruğa girdiğinde, çağrı dizilinceye kadar bekler. önceki mesajdaki tüm karelerin boş, ve ne zaman, olay döngüsü önceki mesajı iptal eder, ve geçerli mesajın karşılık gelen karelerini arama yığına ekler..
Çağrı yığını gerçekleşene kadar mesaj tekrar bekler. kendi karşılık gelen çerçevelerinin boş (yani, istiflenmiş tüm fonksiyonların yerine getirilmesi sona erer), ardından iptal edilir..
Aşağıdaki kodu göz önünde bulundurun:
foo () işlevi işlev çubuğu () foo (); fonksiyon baz () bar (); baz ();
Çalıştırılmakta olan işlev Baz ()
(kod pasajının son satırında) kuyruğa bir mesaj eklenir, ve olay döngüsü onu topladığında çağrı yığını istifleme işlemine başlar için Baz ()
, bar()
, ve fan ()
ilgili uygulama noktalarında.
İşlevlerin yürütülmesi tek tek tamamlandıktan sonra, çerçeveleri arama yığından kaldırıldı, mesaj varken hala sırada bekliyor, a kadar Baz ()
yığından atıldı.
Unutmayın, işlev çağrıları JavaScript’e asla yönlendirmeyin, Onlar bitti mesaj yoluyla. Bu yüzden ne zaman birisinin JavaScript’in kendisinin eşzamansız bir programlama dili olduğunu söylediğini duyduğunuzda, kendi “Cevaplama makinesi”, ve mesaj bırakmada nasıl özgür olduğunuzu.
Ancak, belirli asenkron yöntemlere ne dersiniz??
Şimdiye kadar gibi API'lere dokunmadım setTimeout ()
ve AJAX, bunlar olanlar özellikle eşzamansız olarak adlandırılır. Neden?
Tam olarak neyin senkronize veya asenkronize olduğunu bilmek önemlidir. JavaScript, olayların ve olay döngüsünün yardımıyla pratik yapabilir mesajların eşzamansız işlenmesi, ama bu demek değil her şey JavaScript’te eşzamansız.
Unutma, mesaj yığınının telefon yığınına gelene kadar gitmediğini söylemiştim. karşılık gelen kareleri boş, Tıpkı cevabını alana kadar bir film için ayrılmadığın gibi. senkronize olmak, orada bekliyorsun görev tamamlanana kadar, ve sen cevap aldın.
bekleme tüm senaryolarda ideal değildir. Bir mesaj bıraktıktan sonra beklemek yerine film için ayrılabilirseniz ne olur? Bir işlev emekli olabilirse (çağrı yığınını boşaltırsa) ve işlevi, görev tamamlanmadan önce mesajı kesilebilirse ne olur? Ya senkronize olmayan bir şekilde kod çalıştırılabilirse?
Bu gibi API'ler setTimeout ()
ve AJAX resme giriyor ve yaptıkları… devam et, bu makalenin ikinci bölümünde göreceğimiz Bay X'e geri dönmeden bunu açıklayamam. Bizi izlemeye devam edin.