window.pipedriveLeadboosterConfig = { basis: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', versie: 2, } ;(functie () { var w = venster als (w.LeadBooster) { console.warn('LeadBooster bestaat al') } anders { w.LeadBooster = { q: [], on: functie (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: functie (n) { this.q.push({ t: 't', n: n }) }, } } })() Asynchroon en ééndraads JavaScript? - The Codest
The Codest
  • Over ons
  • Diensten
    • Software Ontwikkeling
      • Frontend ontwikkeling
      • Backend ontwikkeling
    • Staff Augmentation
      • Frontend ontwikkelaars
      • Backend ontwikkelaars
      • Gegevensingenieurs
      • Cloud Ingenieurs
      • QA ingenieurs
      • Andere
    • Het advies
      • Audit & Consulting
  • Industrie
    • Fintech & Bankieren
    • E-commerce
    • Adtech
    • Gezondheidstechnologie
    • Productie
    • Logistiek
    • Automotive
    • IOT
  • Waarde voor
    • CEO
    • CTO
    • Leveringsmanager
  • Ons team
  • Case Studies
  • Weten hoe
    • Blog
    • Ontmoetingen
    • Webinars
    • Bronnen
Carrière Neem contact op
  • Over ons
  • Diensten
    • Software Ontwikkeling
      • Frontend ontwikkeling
      • Backend ontwikkeling
    • Staff Augmentation
      • Frontend ontwikkelaars
      • Backend ontwikkelaars
      • Gegevensingenieurs
      • Cloud Ingenieurs
      • QA ingenieurs
      • Andere
    • Het advies
      • Audit & Consulting
  • Waarde voor
    • CEO
    • CTO
    • Leveringsmanager
  • Ons team
  • Case Studies
  • Weten hoe
    • Blog
    • Ontmoetingen
    • Webinars
    • Bronnen
Carrière Neem contact op
Pijl terug KEREN TERUG
2020-03-31
Software Ontwikkeling

Asynchroon en single-threaded JavaScript?

Lukasz Kolko

JavaScript is een single-threaded taal en tegelijkertijd ook non-blocking, asynchroon en concurrent. Dit artikel legt je uit hoe dat in zijn werk gaat.

  • Runtime

JavaScript is een geïnterpreteerde taal, geen gecompileerde taal. Dit betekent dat het een interpreter nodig heeft die de JS code naar een machinecode. Er zijn verschillende soorten interpreters (engines genoemd). De populairste browser engines zijn V8 (Chrome), Quantum (Firefox) en WebKit (Safari). Overigens wordt V8 ook gebruikt in een populaire niet-browser runtime, Node.js.

Elke engine bevat een memory heap, een call stack, een event loop, een callback queue en een WebAPI met HTTP requests, timers, events, etc., allemaal op hun eigen manier geïmplementeerd voor een snellere en veiligere interpretatie van de JS code.

JavaScript ontwikkeling

Basis JS runtime-architectuur. Auteur: Alex Zlatkov

Enkele draad

Een single-thread taal is een taal met een enkele aanroepstapel en een enkele geheugenhoop. Dit betekent dat er maar één ding tegelijk wordt uitgevoerd.

A stapel is een doorlopend geheugengebied, dat lokale context toewijst voor elke uitgevoerde functie.

A hoop is een veel groter gebied, waarin alles wordt opgeslagen dat dynamisch wordt toegewezen.

A oproepstapel is een gegevensstructuur die in principe bijhoudt waar we ons in het programma bevinden.

Stapel oproepen

Laten we een eenvoudige code schrijven en bijhouden wat er gebeurt op de aanroepstapel.

JavaScript softwareontwikkeling

Zoals je kunt zien, worden de functies toegevoegd aan de stack, uitgevoerd en later verwijderd. Het is de zogenaamde LIFO manier - Last In, First Out. Elk item in de aanroepstapel wordt een stapelframe.

Kennis van de aanroepstapel is nuttig voor het lezen van foutstapelsporen. Over het algemeen staat de exacte reden voor de fout bovenaan in de eerste regel, hoewel de volgorde van code-uitvoering bottom-up is.

Soms kunt u te maken krijgen met een populaire fout, gemeld door Maximale grootte aanroepstapel overschreden. Het is eenvoudig om dit te krijgen met behulp van recursie:

functie foo() {
    foo()
}
foo()

en onze browser of terminal loopt vast. Elke browser, zelfs de verschillende versies, heeft een andere limiet voor de grootte van de aanroepstapel. In de overgrote meerderheid van de gevallen zijn deze voldoende en moet het probleem ergens anders worden gezocht.

Geblokkeerde aanroepstapel

Hier is een voorbeeld van het blokkeren van de JS thread. Laten we proberen een foo bestand en een bar met behulp van de Knooppunt.js synchrone functie readFileSync.

JavaScript code

Dit is een geluste GIF. Zoals je ziet, wacht de JS-engine tot de eerste oproep in readFileSync is voltooid. Maar dit zal niet gebeuren omdat er geen foo bestand, dus de tweede functie zal nooit worden aangeroepen.

Asynchroon gedrag

JS kan echter ook non-blocking zijn en zich gedragen alsof het multi-threaded is. Dit betekent dat het niet wacht op het antwoord van een API-aanroep, I/O-gebeurtenissen, enzovoort, en door kan gaan met het uitvoeren van code. Dit is mogelijk dankzij de JS engines die (onder de motorkap) echte multi-threading talen gebruiken, zoals C++ (Chrome) of Rust (Firefox). Ze voorzien ons van de Web API onder de browserkappen of bijv. I/O API onder Node.js.

JavaScript programmeertaal

In de bovenstaande GIF kunnen we zien dat de eerste functie naar de aanroepstapel wordt geduwd en Hoi wordt onmiddellijk uitgevoerd in de console.

Vervolgens roepen we de setTimeout functie van de WebAPI van de browser. Het gaat naar de oproepstapel en zijn asynchrone callback foo functie gaat naar de wachtrij van de WebApi, waar het wacht op de oproep, die is ingesteld om na 3 seconden te gebeuren.

Ondertussen gaat het programma verder met de code en zien we Hallo. Ik ben niet geblokkeerd in de console.

Nadat deze is aangeroepen, gaat elke functie in de WebAPI-wachtrij naar de Terugbel wachtrij. Het is waar functies wachten tot de aanroepstapel leeg is. Als dat gebeurt, worden ze er één voor één naartoe verplaatst.

Dus toen onze setTimeout timer klaar is met aftellen, zal onze foo functie gaat naar de callbackwachtrij, wacht tot de oproepstapel beschikbaar komt, gaat daarheen, wordt uitgevoerd en we zien Hi van asynchrone callback in de console.

Gebeurtenis lus

De vraag is, hoe weet de runtime dat de aanroepstapel leeg is en hoe wordt de gebeurtenis in de callbackwachtrij aangeroepen? Maak kennis met de event-lus. Dit is een onderdeel van de JS-engine. Dit proces controleert voortdurend of de aanroepstapel leeg is en als dat zo is, controleert het of er een gebeurtenis in de callbackwachtrij staat die wacht om te worden aangeroepen.

Dat is alle magie achter de schermen!

De theorie samenvatten

Concurrency en parallellisme

Concurrentie betekent meerdere taken tegelijkertijd uitvoeren, maar niet tegelijkertijd. Twee taken werken bijvoorbeeld in overlappende tijdsperioden.

Parallellisme betekent twee of meer taken tegelijkertijd uitvoeren, bijvoorbeeld meerdere berekeningen tegelijkertijd uitvoeren.

Draden en processen

Draden zijn een opeenvolging van code die onafhankelijk van elkaar kunnen worden uitgevoerd.

Proces is een instantie van een lopend programma. Een programma kan meerdere processen hebben.

Synchroon en asynchroon

In synchroon Bij programmeren worden taken na elkaar uitgevoerd. Elke taak wacht tot een vorige taak is voltooid en wordt dan pas uitgevoerd.

In asynchroon programmering, wanneer een taak is uitgevoerd, kun je overschakelen naar een andere taak zonder te wachten tot de vorige is voltooid.

Synchroon en asynchroon in een omgeving met één of meerdere threads

Synchroon met één thread: Taken worden na elkaar uitgevoerd. Elke taak wacht tot de vorige taak is uitgevoerd.

Synchroon met meerdere threads: Taken worden uitgevoerd in verschillende threads, maar wachten op andere uitvoerende taken op een andere thread.

Asynchroon met één thread: Taken worden uitgevoerd zonder te wachten tot een andere taak klaar is. Op een gegeven moment kan slechts één taak worden uitgevoerd.

Asynchroon met meerdere threads: Taken worden in verschillende threads uitgevoerd zonder te wachten tot andere taken klaar zijn en voltooien hun uitvoering onafhankelijk van elkaar.

JavaScript classificatie

Als we kijken naar hoe JS engines onder de motorkap werken, kunnen we JS classificeren als een asynchrone en single-threaded geïnterpreteerde taal. Het woord "geïnterpreteerd" is erg belangrijk omdat het betekent dat de taal altijd runtime-afhankelijk zal zijn en nooit zo snel als gecompileerde talen met ingebouwde multi-threading.

Het is opmerkelijk dat Node.js echte multi-threading kan bereiken, op voorwaarde dat elke thread gestart wordt als een afzonderlijk proces. Hier zijn bibliotheken voor, maar Node.js heeft een ingebouwde functie genaamd Werkdraad.

Alle event loop GIF's komen van de Loep applicatie gemaakt door Philip Roberts, waarin je je asynchrone scenario's kunt testen.

Lees meer:

Waarom je (waarschijnlijk) Typescript zou moeten gebruiken?

Kwaliteit eerst! 5 eenvoudige stappen om je code te linten met GitHub workflows in JavaScript project

Hoe kun je Vue.js-apps verbeteren? Enkele praktische tips

Verwante artikelen

Software Ontwikkeling

Bouw Toekomstbestendige Web Apps: Inzichten van The Codest's Expert Team

Ontdek hoe The Codest uitblinkt in het creëren van schaalbare, interactieve webapplicaties met geavanceerde technologieën, het leveren van naadloze gebruikerservaringen op alle platforms. Ontdek hoe onze expertise digitale transformatie en business...

DE BESTE
Software Ontwikkeling

Top 10 in Letland gevestigde bedrijven voor softwareontwikkeling

Lees meer over de beste softwareontwikkelingsbedrijven van Letland en hun innovatieve oplossingen in ons nieuwste artikel. Ontdek hoe deze technologieleiders uw bedrijf kunnen helpen verbeteren.

thecodest
Oplossingen voor ondernemingen en schaalvergroting

Essentiële Java-softwareontwikkeling: Een gids voor succesvol uitbesteden

Verken deze essentiële gids over succesvolle outsourcing Java-softwareontwikkeling om de efficiëntie te verbeteren, toegang te krijgen tot expertise en projectsucces te stimuleren met The Codest.

thecodest
Software Ontwikkeling

De ultieme gids voor outsourcing in Polen

De sterke groei van outsourcing in Polen wordt gedreven door economische, educatieve en technologische vooruitgang, die IT-groei en een bedrijfsvriendelijk klimaat stimuleert.

DeCodest
Oplossingen voor ondernemingen en schaalvergroting

De complete gids voor IT-auditmiddelen en -technieken

IT-audits zorgen voor veilige, efficiënte en compliant systemen. Lees het volledige artikel om meer te weten te komen over het belang ervan.

The Codest
Jakub Jakubowicz CTO & medeoprichter

Abonneer je op onze kennisbank en blijf op de hoogte van de expertise uit de IT-sector.

    Over ons

    The Codest - Internationaal softwareontwikkelingsbedrijf met technische hubs in Polen.

    Verenigd Koninkrijk - Hoofdkantoor

    • Kantoor 303B, 182-184 High Street North E6 2JA
      Londen, Engeland

    Polen - Lokale technologieknooppunten

    • Fabryczna kantorenpark, Aleja
      Pokoju 18, 31-564 Krakau
    • Hersenambassade, Konstruktorska
      11, 02-673 Warschau, Polen

      The Codest

    • Home
    • Over ons
    • Diensten
    • Case Studies
    • Weten hoe
    • Carrière
    • Woordenboek

      Diensten

    • Het advies
    • Software Ontwikkeling
    • Backend ontwikkeling
    • Frontend ontwikkeling
    • Staff Augmentation
    • Backend ontwikkelaars
    • Cloud Ingenieurs
    • Gegevensingenieurs
    • Andere
    • QA ingenieurs

      Bronnen

    • Feiten en fabels over samenwerken met een externe partner voor softwareontwikkeling
    • Van de VS naar Europa: Waarom Amerikaanse startups besluiten naar Europa te verhuizen
    • Tech Offshore Ontwikkelingshubs Vergelijking: Tech Offshore Europa (Polen), ASEAN (Filippijnen), Eurazië (Turkije)
    • Wat zijn de grootste uitdagingen voor CTO's en CIO's?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Gebruiksvoorwaarden website

    Copyright © 2025 door The Codest. Alle rechten voorbehouden.

    nl_NLDutch
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese ko_KRKorean es_ESSpanish etEstonian elGreek nl_NLDutch