(function(w,d,s,l,i){w[l]=w[l]|||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=? 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5LHNRP9'); Asinhronais un vienpavedienu JavaScript? - The Codest
The Codest
  • Par mums
  • Pakalpojumi
    • Programmatūras izstrāde
      • Frontend izveide
      • Backend izstrāde
    • Staff Augmentation
      • Frontend izstrādātāji
      • Backend izstrādātāji
      • Datu inženieri
      • Mākoņa inženieri
      • QA inženieri
      • Citi
    • Tā Konsultatīvais dienests
      • Audits un konsultācijas
  • Nozares
    • Fintech un banku darbība
    • E-commerce
    • Adtech
    • Healthtech
    • Ražošana
    • Loģistika
    • Automobiļu nozare
    • IOT
  • Vērtība par
    • CEO
    • CTO
    • Piegādes vadītājs
  • Mūsu komanda
  • Case Studies
  • Zināt, kā
    • Blogs
    • Tikšanās
    • Tiešsaistes semināri
    • Resursi
Karjera Sazinieties ar mums
  • Par mums
  • Pakalpojumi
    • Programmatūras izstrāde
      • Frontend izveide
      • Backend izstrāde
    • Staff Augmentation
      • Frontend izstrādātāji
      • Backend izstrādātāji
      • Datu inženieri
      • Mākoņa inženieri
      • QA inženieri
      • Citi
    • Tā Konsultatīvais dienests
      • Audits un konsultācijas
  • Vērtība par
    • CEO
    • CTO
    • Piegādes vadītājs
  • Mūsu komanda
  • Case Studies
  • Zināt, kā
    • Blogs
    • Tikšanās
    • Tiešsaistes semināri
    • Resursi
Karjera Sazinieties ar mums
Atpakaļ bultiņa ATGRIEZTIES ATPAKAĻ
2020-09-02
Programmatūras izstrāde

Asinhronais un vienpavedienu JavaScript?

Lukāšs Kolko

JavaScript ir vienpavedienu valoda, kas vienlaikus ir arī nebloķējoša, asinhrona un vienlaicīga. Šajā rakstā tiks izskaidrots, kā tas notiek.

  • Runtime

JavaScript ir interpretēta, nevis kompilēta valoda. Tas nozīmē, ka tai ir nepieciešams tulks, kas konvertē JS kods mašīnkodā. Ir vairāku veidu tulki (t. s. dzinēji). Populārākie pārlūkprogrammu dzinēji ir V8 (Chrome), Quantum (Firefox) un WebKit (Safari). Starp citu, V8 tiek izmantots arī populārajā palīgprogrammā, kas nav pārlūkprogramma, Node.js.

Katrā dzinējā ir atmiņas kaudze, izsaukumu kaudze, notikumu cilpa, atsaukumu rinda un WebAPI ar HTTP pieprasījumiem, taimeriem, notikumiem u. c., kas visi ir ieviesti savā veidā, lai ātrāk un drošāk interpretētu JS kodu.

JavaScript izstrāde

JS izpildes laika arhitektūras pamati. Autors: Autors: Alex Zlatkov

Viena vītne

Viena pavediena valoda ir valoda ar vienu izsaukumu kaudzi un vienu atmiņas kaudzi. Tas nozīmē, ka tajā vienlaikus tiek izpildīta tikai viena darbība.

A kaudze ir nepārtraukts atmiņas apgabals, kurā katrai izpildītajai funkcijai tiek piešķirts vietējais konteksts.

A kaudze ir daudz lielāks reģions, kurā tiek glabāts viss dinamiski piešķirtais.

A izsaukumu kaudze ir dati struktūra, kurā būtībā ir ierakstīts, kur mēs atrodamies programmā.

Zvanu kaudze

Uzrakstīsim vienkāršu kodu un novērosim, kas notiek izsaukumu kaudzē.

JavaScript programmatūras izstrāde

Kā redzat, funkcijas tiek pievienotas kaudzē, izpildītas un vēlāk dzēstas. Tas ir tā sauktais LIFO veids - Pēdējais iekšā, pirmais ārā. Katru izsaukumu kaudzes ierakstu sauc par kaudzes rāmis.

Zināšanas par izsaukumu kaudzīti ir noderīgas, lai lasītu kļūdu kaudzītes izsekojumus. Parasti precīzs kļūdas iemesls ir pirmās rindas augšpusē, lai gan koda izpildes secība ir no apakšas uz augšu.

Dažreiz var tikt galā ar populāru kļūdu, par kuru paziņo Pārsniegts maksimālais izsaukumu kaudzes lielums. To var viegli iegūt, izmantojot rekursiju:

funkcija foo() {
    foo()
}
foo()

un mūsu pārlūkprogramma vai termināls sastingst. Katrai pārlūkprogrammai, pat to dažādajām versijām, ir atšķirīgs izsaukumu kaudzes lieluma ierobežojums. Lielākajā daļā gadījumu tie ir pietiekami, un problēma jāmeklē citur.

Bloķēts izsaukumu kaudze

Šeit ir JS pavediena bloķēšanas piemērs. Mēģināsim nolasīt foo failu un bārs izmantojot Mezgls.js sinhronā funkcija readFileSync.

JavaScript kods

Šis ir cilpveida GIF. Kā redzat, JS dzinējs gaida līdz pirmajam izsaukumam no readFileSync ir pabeigta. Bet tas nenotiks, jo nav foo failu, tāpēc otrā funkcija nekad netiks izsaukta.

Asinhronā uzvedība

Tomēr JS var arī nebloķēt un darboties tā, it kā tas būtu daudzpavedienu lietojums. Tas nozīmē, ka tas negaida atbildi no API izsaukumiem, I/O notikumiem u.c. un var turpināt koda izpildi. Tas ir iespējams, pateicoties JS dzinējiem, kas izmanto (zem pārsega) reālas daudzkārtu valodas, piemēram, C++ (Chrome) vai Rust (Firefox). Tās nodrošina mums ar Tīmekļa vietne API zem pārlūkprogrammas pārsegiem vai ex. I/O API zem Node.js.

JavaScript programmēšanas valoda

Iepriekš redzamajā GIF attēlā redzams, ka pirmā funkcija tiek ievietota izsaukumu kaudzē un Sveiki nekavējoties tiek izpildīts konsoles logā.

Pēc tam mēs izsaucam setTimeout funkcija, ko nodrošina pārlūkprogrammas WebAPI. Tā nonāk izsaukumu kaudzē un tās asinhronajā atpakaļsaukumā foo funkcija nonāk WebApi rindā, kur tā gaida izsaukumu, kas tiek iestatīts pēc 3 sekundēm.

Tikmēr programma turpina kodu, un mēs redzam. Sveiki. Es neesmu bloķēts konsolē.

Pēc izsaukšanas katra WebAPI rindā esošā funkcija tiek nosūtīta uz Atgriezenisko zvanu rinda. Tā ir vieta, kur funkcijas gaida, līdz izsaukumu kaudze ir tukša. Kad tas notiek, tās tur tiek pārvietotas viena pēc otras.

Tātad, kad mūsu setTimeout taimeris pabeidz atpakaļskaitīšanu, mūsu foo funkcija dodas uz atpakaļsaukumu rindu, gaida, kamēr izsaukumu kaudze kļūst pieejama, dodas uz to, tiek izpildīta un mēs redzam. Sveiki no asinhronā atgriezeniskā izsaukuma konsolē.

Notikumu cilpa

Jautājums ir par to, kā izpildmehānisms uzzina, ka izsaukumu kaudze ir tukša, un kā tiek izsaukts notikums izsaukumu atgriezeniskās saites rindā? Iepazīstieties ar notikumu cilpu. Tā ir JS dzinēja daļa. Šis process nepārtraukti pārbauda, vai izsaukumu kaudze ir tukša, un, ja tā ir, uzrauga, vai izsaukumu atgriezeniskās saites rindā ir notikums, kas gaida, lai to izsauktu.

Tā ir visa burvība aizkulisēs!

Teorijas kopsavilkums

Vienlaicīgums un paralēlisms

Vienlaicīgums tas nozīmē, ka vienlaicīgi tiek veikti vairāki uzdevumi, bet ne vienlaicīgi. Piemēram, divi uzdevumi tiek izpildīti laika periodos, kas pārklājas.

Paralēlisms ir divu vai vairāku uzdevumu veikšana vienlaicīgi, piemēram, vairāku aprēķinu veikšana vienlaicīgi.

Diegi un procesi

Diegi ir koda izpildes secība, ko var izpildīt neatkarīgi vienu no otra.

Process ir darbojošās programmas gadījums. Programmai var būt vairāki procesi.

Sinhronais un asinhronais

In sinhronais programmēšana, uzdevumi tiek izpildīti viens pēc otra. Katrs uzdevums gaida, kamēr tiek pabeigts iepriekšējais uzdevums, un tikai tad tiek izpildīts.

In asinhronais programmēšana, kad ir izpildīts viens uzdevums, varat pārslēgties uz citu uzdevumu, negaidot, kamēr tiks pabeigts iepriekšējais.

Sinhronā un asinhronā darbība vienpavediena un daudzpavedienu vidē

Sinhronais ar vienu pavedienu: Uzdevumi tiek izpildīti viens pēc otra. Katrs uzdevums gaida, kamēr tiks izpildīts iepriekšējais uzdevums.

Sinhronais ar vairākiem pavedieniem: Uzdevumi tiek izpildīti dažādos pavedienos, bet gaida jebkuru citu uzdevumu izpildi jebkurā citā pavedienā.

Asinhronā režīmā ar vienu pavedienu: Uzdevumi tiek sākti izpildīt, negaidot, kamēr tiks pabeigts cits uzdevums. Vienā brīdī var izpildīt tikai vienu uzdevumu.

Asinhronais ar vairākiem pavedieniem: Uzdevumi tiek izpildīti dažādos pavedienos, negaidot citu uzdevumu pabeigšanu un pabeidzot to izpildi neatkarīgi.

JavaScript klasifikācija

Ja aplūkojam, kā JS dzinēji darbojas zem pārsega, JS varam klasificēt kā asinhronu un viena pavediena interpretētu valodu. Vārds “interpretēta” ir ļoti svarīgs, jo tas nozīmē, ka valoda vienmēr būs atkarīga no izpildes laika un nekad nebūs tik ātra kā kompilētās valodas ar iebūvētu daudzkārtu lietojumu.

Jāatzīmē, ka Node.js var panākt reālu daudzpavedienu darbību, ja katrs pavediens tiek palaists kā atsevišķs process. Šim nolūkam ir bibliotēkas, bet Node.js ir iebūvēta funkcija, ko sauc par Strādnieku pavedieni.

Visi notikumu cilpas GIF faili nāk no Lupa Filipa Robertsa izveidotā lietojumprogramma, kurā varat pārbaudīt savus asinhronos scenārijus.

Lasīt vairāk:

Kāpēc jums (iespējams) vajadzētu izmantot Typescript?

Kvalitāte ir pirmajā vietā! 5 vienkārši soļi, lai JavaScript projektā uzlabotu kodu ar GitHub darbplūsmām

Kā uzlabot Vue.js lietotnes? Daži praktiski padomi

Saistītie raksti

Ilustrācija viedtālruņa veselības aprūpes lietotnei ar sirds ikonu un pieaugošo veselības diagrammu, kas apzīmēta ar The Codest logotipu, kurš pārstāv digitālās veselības un HealthTech risinājumus.
Programmatūras izstrāde

Veselības aprūpes programmatūra: Mārketinga programmatūra: veidi, izmantošanas gadījumi

Šodien veselības aprūpes organizāciju rīcībā esošie rīki vairs neatgādina papīra diagrammas, kas tika izmantotas pirms vairākiem gadu desmitiem. veselības aprūpes programmatūra tagad atbalsta veselības aprūpes sistēmas, pacientu aprūpi un mūsdienīgu veselības aprūpes sniegšanu klīniskajās un...

TĀKĀDĒJAIS
Abstrakta ilustrācija ar lejupejošu joslu diagrammu ar augošu bultiņu un zelta monētu, kas simbolizē izmaksu efektivitāti vai ietaupījumus. Augšējā kreisajā stūrī redzams The Codest logotips ar saukli "In Code We Trust" uz gaiši pelēka fona.
Programmatūras izstrāde

Kā paplašināt izstrādātāju komandu, nezaudējot produkta kvalitāti

Palielināt izstrādātāju komandu? Uzziniet, kā augt, nezaudējot produkta kvalitāti. Šajā rokasgrāmatā aplūkotas pazīmes, kas liecina, ka ir pienācis laiks paplašināt komandu, komandas struktūra, pieņemšana darbā, vadība un rīki, kā arī tas, kā The Codest var...

TĀKĀDĒJAIS
Programmatūras izstrāde

Uz nākotni noturīgu tīmekļa lietojumprogrammu veidošana: The Codest ekspertu komandas ieskats

Uzziniet, kā The Codest izceļas mērogojamu, interaktīvu tīmekļa lietojumprogrammu izveidē, izmantojot modernākās tehnoloģijas un nodrošinot viengabalainu lietotāja pieredzi visās platformās. Uzziniet, kā mūsu zināšanas veicina digitālo transformāciju un biznesa...

TĀKĀDĒJAIS
Programmatūras izstrāde

Top 10 Latvijā bāzēti programmatūras izstrādes uzņēmumi

Mūsu jaunākajā rakstā uzziniet vairāk par Latvijas labākajiem programmatūras izstrādes uzņēmumiem un to inovatīvajiem risinājumiem. Uzziniet, kā šie tehnoloģiju līderi var palīdzēt uzlabot jūsu biznesu.

thecodest
Uzņēmumu un mērogošanas risinājumi

Java programmatūras izstrādes pamati: A Guide to Outsourcing Successfully

Izpētiet šo būtisko rokasgrāmatu par veiksmīgu outsourcing Java programmatūras izstrādi, lai uzlabotu efektivitāti, piekļūtu speciālajām zināšanām un sekmīgi īstenotu projektus ar The Codest.

thecodest

Abonējiet mūsu zināšanu bāzi un saņemiet jaunāko informāciju par IT nozares pieredzi.

    Par mums

    The Codest - starptautisks programmatūras izstrādes uzņēmums ar tehnoloģiju centriem Polijā.

    Apvienotā Karaliste - Galvenā mītne

    • 303B birojs, 182-184 High Street North E6 2JA
      Londona, Anglija

    Polija - Vietējie tehnoloģiju centri

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Krakova
    • Brain Embassy, Konstruktorska
      11, 02-673 Varšava, Polija

    The Codest

    • Sākums
    • Par mums
    • Pakalpojumi
    • Case Studies
    • Zināt, kā
    • Karjera
    • Vārdnīca

    Pakalpojumi

    • Tā Konsultatīvais dienests
    • Programmatūras izstrāde
    • Backend izstrāde
    • Frontend izveide
    • Staff Augmentation
    • Backend izstrādātāji
    • Mākoņa inženieri
    • Datu inženieri
    • Citi
    • QA inženieri

    Resursi

    • Fakti un mīti par sadarbību ar ārējo programmatūras izstrādes partneri
    • No ASV uz Eiropu: Kāpēc Amerikas jaunuzņēmumi nolemj pārcelties uz Eiropu?
    • Tehnoloģiju ārzonas attīstības centru salīdzinājums: Tech Offshore Eiropa (Polija), ASEAN (Filipīnas), Eirāzija (Turcija)
    • Kādi ir galvenie CTO un CIO izaicinājumi?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Autortiesības © 2026 The Codest. Visas tiesības aizsargātas.

    lvLatvian
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian es_ESSpanish nl_NLDutch etEstonian elGreek pt_PTPortuguese cs_CZCzech lt_LTLithuanian is_ISIcelandic lvLatvian