Sinhronās un asinhronās JavaScript izpratne - 1.daļa
Sinhrona un asinhrona ir mulsinoši jēdzieni JavaScript, jo īpaši iesācējiem. Divas vai vairākas lietas ir sinhroni kad viņi notiek vienlaicīgi (sinhronizācijā) un asinhroni, ja tie nav (nav sinhronizēts).
Lai gan šīs definīcijas ir viegli ņemt vērā, tas patiesībā ir sarežģītāks nekā izskatās. Mums ir jāņem vērā kas tieši ir sinhronizēti, un kas nav.
Iespējams, zvanīsiet uz normāli
darbojas sinhronā JavaScript, vai ne? Un, ja tas ir kaut kas līdzīgs setTimeout ()
vai AJAX, ar kuru strādājat, jūs to norādīsiet kā asinhronu, jā? Ko darīt, ja es jums to saku abi tādā veidā ir asinhroni?
Izskaidrot kāpēc, mums ir jāgriežas pie X kunga, lai saņemtu palīdzību.
1. scenārijs - X kungs mēģina sinhronizēt
Šeit ir iestatījums:
- X ir kāds, kurš var atbildēt uz grūtiem jautājumiem un veikt jebkuru pieprasīto uzdevumu.
- Vienīgais veids, kā sazināties ar viņu, ir pa telefonu.
- Lai kāds būtu jautājums vai uzdevums, lai uzdotu X kunga palīdzību, lai to īstenotu; jūs viņu saucat.
- X kungs jums sniedz atbildi vai pabeidz uzdevumu tūlīt pat, un ļauj jums zināt tas ir pabeigts.
- Jūs nolaidāt uztvērēja sajūtu saturu un iziet filmai.
Tas, ko tikko veikāt, bija a sinhronā (turp un atpakaļ) komunikācija Viņš uzklausīja, kad jūs viņam jautājāt, un jūs klausījāties, kad viņš atbildēja.
2. scenārijs - X kungs nav apmierināts ar sinhronitāti
Tā kā X kungs ir tik efektīvs, viņš sāk saņemt daudz vairāk zvanu. Tātad, kas notiek, ja jūs viņu saucat, bet viņš jau ir aizņemts runā ar kādu citu? Jūs nevarēsiet viņam uzdot savu jautājumu - ne līdz brīdim, kad viņš varēs saņemt jūsu zvanu. Viss, ko jūs dzirdēsiet, ir aizņemts signāls.
Tātad, ko var darīt X kungs, lai to apkarotu?
Tā vietā, lai zvanītu tieši:
- Mr X pieņem jaunu puisis, M kungu un dod viņam atbildētāju zvanītājiem atstāt ziņojumus.
- M. M uzdevums ir nodot ziņu no atbildētāja līdz X kungam, kad viņš zina, ka X kungs ir pilnīgi pabeidzis visu iepriekšējo ziņojumu apstrādi un jau ir brīvi uzņemties jaunu.
- Tātad, tagad, kad jūs viņu saucat, aizņemts tonis, tad jūs varat atstāt ziņojumu X kungam jāgaida, lai viņš jums piezvanītu (vēl nav filmu laika).
- Kad X kungs būs paveicis visus rindā esošos ziņojumus, kurus viņš saņēma pirms jūsu, viņš izskatīs jūsu problēmu un zvaniet jums atpakaļ sniegt jums atbildi.
Tagad šeit ir jautājums: vai līdz šim veiktie pasākumi sinhroni vai asinhroni?
Tas ir jaukts. Kad esat atstājis ziņu, X kungs to neklausījās, tāpēc ceturtā saziņa bija asinhrona.
Bet, kad viņš atbildēja, tu esi tur klausījies, kas padara atgriezenisko saziņu sinhronu.
Es ceru, ka tagad jūs esat ieguvuši labāku izpratni par to, kā sinhronisms tiek uztverts saziņas ziņā. Laiks ienest JavaScript.
JavaScript - asinhronā programmēšanas valoda
Kad kāds iezīmē JavaScript asinhronu, tas, ko viņi parasti atsaucas, ir tas, kā jūs varat atstāj ziņu par to, un jūsu zvans nav bloķēts ar aizņemtu toņu.
Funkcijas zvani ir nekad nepārvaldiet JavaScript, viņi ir burtiski darīti izmantojot ziņas.
JavaScript lieto a ziņu rindā kur tiek glabāti ienākošie ziņojumi (vai notikumi). An notikumu cikls (ziņu dispečers) secīgi nosūta šos ziņojumus a zvanu kaudze kur ir atbilstošās ziņu funkcijas kaudzē kā rāmji (funkciju argumenti un mainīgie) izpildei.
Zvanu kaudze satur sākotnējās funkcijas, kas tiek izsaukta, rāmi un jebkurus citus aicināmo funkciju kadrus izmantojot ligzdotus zvanus virs tā .
Kad ziņa pievienojas rindai, tā gaida, līdz būs zvanīts tukšs no visiem iepriekšējo ziņu kadriem, un kad tas ir, notikumu cikls dequeues iepriekšējo ziņu, un pievieno pašreizējā ziņojuma atbilstošos kadrus zvanu kaudzei.
Ziņojums atkal tiek gaidīts, līdz zvana kaudze kļūs tukši no saviem atbilstošajiem rāmjiem (t.i., visu stacked funkciju izpilde ir beigusies), tad tiek deformēta.
Apsveriet šādu kodu:
funkcija foo () funkciju josla () foo (); funkcija baz () bar (); baz ();
Funkcija ir palaista baz ()
(koda fragmenta pēdējā rindā), par kuru rindā tiek pievienots ziņojums, un, kad notikuma cilpa to atver, zvana kaudze sāk sakraušanu rāmjus par baz ()
, bārs()
, un foo ()
attiecīgajos izpildes punktos.
Kad funkciju izpilde ir pabeigta pa vienam, to rāmji ir no zvanu kaudzes, kamēr ziņa ir joprojām gaida rindā, līdz baz ()
tiek izlaists no kaudzes.
Atcerieties, ka funkcijas ir nekad nepārvaldiet JavaScript, viņi ir darīti izmantojot ziņas. Tātad, kad jūs dzirdat kādu, ka JavaScript pati par sevi ir asinhrona programmēšanas valoda, pieņemsim, ka viņi runā par iebūvēto “automātiskais atbildētājs”, un kā jūs varat brīvi atstāt ziņojumus.
Bet kā ar konkrētām asinhronām metodēm?
Līdz šim es neesmu pieskāries API, piemēram, setTimeout ()
un AJAX, tie ir tie, kas ir to sauc par asinhronu. Kāpēc ir tā, ka?
Ir svarīgi saprast, kas ir sinhronais vai asinhronais. JavaScript, ar notikumu palīdzību un notikumu ciklu, var praktizēt asinhrona ziņojumu apstrāde, bet tas nenozīmē viss JavaScript ir asinhrons.
Atcerieties, ka es jums teicu, ka ziņa neatstāja līdz zvana kaudze tukšs no atbilstošajiem rāmjiem, tāpat kā jūs neatstājāt filmai, kamēr neesat saņēmis atbildi - tas ir ir sinhroni, tu esi tur gaida līdz uzdevums ir pabeigts, un jūs saņemsiet atbildi.
Gaida nav ideāls visos scenārijos. Ko darīt, ja pēc ziņojuma atstāšanas gaidīšanas vietā jūs varat atstāt filmu? Ko darīt, ja funkcija var aiziet pensijā (iztukšojot zvanu kaudzīti), un tā ziņu var atcelt vēl pirms funkcijas uzdevuma pabeigšanas? Ko darīt, ja jūs varat veikt kodu, kas izpildīts asinhroni?
Tā ir API, piemēram, setTimeout ()
un AJAX nonāk attēlā, un tas, ko viņi dara, ir… turēt, es nevaru to izskaidrot, neatgriežoties pie X kunga, ko mēs redzēsim šā panta otrajā daļā. Sekojiet līdzi.