window.pipedriveLeadboosterConfig = { base: pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(function () { var w = window if (w.LeadBooster) { console.warn('LeadBooster on jo olemassa') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() Asynkroninen ja yksisäikeinen JavaScript? - The Codest
Codest
  • Tietoa meistä
  • Palvelut
    • Ohjelmistokehitys
      • Frontend-kehitys
      • Backend-kehitys
    • Staff Augmentation
      • Frontend-kehittäjät
      • Backend-kehittäjät
      • Tietoinsinöörit
      • Pilvi-insinöörit
      • QA insinöörit
      • Muut
    • Se neuvoa-antava
      • Tilintarkastus & konsultointi
  • Toimialat
    • Fintech & pankkitoiminta
    • E-commerce
    • Adtech
    • Terveysteknologia
    • Valmistus
    • Logistiikka
    • Autoteollisuus
    • IOT
  • Arvo
    • TOIMITUSJOHTAJA
    • CTO
    • Toimituspäällikkö
  • Tiimimme
  • Tapaustutkimukset
  • Tiedä miten
    • Blogi
    • Tapaamiset
    • Webinaarit
    • Resurssit
Työurat Ota yhteyttä
  • Tietoa meistä
  • Palvelut
    • Ohjelmistokehitys
      • Frontend-kehitys
      • Backend-kehitys
    • Staff Augmentation
      • Frontend-kehittäjät
      • Backend-kehittäjät
      • Tietoinsinöörit
      • Pilvi-insinöörit
      • QA insinöörit
      • Muut
    • Se neuvoa-antava
      • Tilintarkastus & konsultointi
  • Arvo
    • TOIMITUSJOHTAJA
    • CTO
    • Toimituspäällikkö
  • Tiimimme
  • Tapaustutkimukset
  • Tiedä miten
    • Blogi
    • Tapaamiset
    • Webinaarit
    • Resurssit
Työurat Ota yhteyttä
Takaisin nuoli PALAA TAAKSE
2020-03-31
Ohjelmistokehitys

Asynkroninen ja yksisäikeinen JavaScript?

Lukasz Kolko

JavaScript on yksisäikeinen kieli, joka on samalla myös lukkiutumaton, asynkroninen ja samanaikainen. Tässä artikkelissa selitetään sinulle, miten se tapahtuu.

  • Suoritusaika

JavaScript on tulkattu kieli, ei käännetty. Tämä tarkoittaa, että se tarvitsee tulkin, joka muuntaa JS koodi konekoodiksi. Tulkkeja (ns. moottoreita) on useita erilaisia. Suosituimmat selainmoottorit ovat V8 (Chrome), Quantum (Firefox) ja WebKit (Safari). V8:aa käytetään muuten myös suositussa muussa kuin selaimen ajoajassa, Node.js.

Jokainen moottori sisältää muistikasan, kutsupinon, tapahtumasilmukan, takaisinkutsujonon ja WebAPI:n, jossa on HTTP-pyyntöjä, ajastimia, tapahtumia jne., jotka on kaikki toteutettu omalla tavallaan JS-koodin nopeamman ja turvallisemman tulkinnan varmistamiseksi.

JavaScript-kehitys

JS:n perusarkkitehtuuri. Kirjoittaja: Alex Zlatkov

Yksittäinen lanka

Yksisäikeinen kieli on kieli, jossa on yksi kutsupino ja yksi muistikasa. Se tarkoittaa, että sillä suoritetaan vain yhtä asiaa kerrallaan.

A pino on jatkuva muistialue, joka varaa paikallisen kontekstin jokaiselle suoritettavalle funktiolle.

A kasa on paljon laajempi alue, johon tallennetaan kaikki dynaamisesti varattu.

A kutsupino on tietorakenne, joka periaatteessa tallentaa, missä vaiheessa ohjelmaa olemme.

Kutsupino

Kirjoitetaan yksinkertainen koodi ja seurataan, mitä kutsupinossa tapahtuu.

JavaScript-ohjelmiston kehittäminen

Kuten näet, funktiot lisätään pinoon, suoritetaan ja myöhemmin poistetaan. Tämä on niin sanottu LIFO-menetelmä - Last In, First Out. Jokaista kutsupinon merkintää kutsutaan pinokehys.

Kutsupinon tunteminen on hyödyllistä virhepinojen jälkien lukemisessa. Yleensä virheen tarkka syy on ensimmäisellä rivillä ylhäällä, vaikka koodin suoritusjärjestys on alhaalta ylöspäin.

Joskus voit käsitellä suosittua virhettä, jonka ilmoittaa Kutsupinon enimmäiskoko ylitetty. Tämä on helppo saada aikaan rekursiolla:

funktio foo() {
    foo()
}
foo()

ja selaimemme tai päätelaitteemme jäätyy. Jokaisella selaimella, jopa niiden eri versioilla, on erilainen kutsupinon kokorajoitus. Suurimmassa osassa tapauksia ne ovat riittäviä, ja ongelma on etsittävä muualta.

Estetty kutsupino

Tässä on esimerkki JS-säikeen estämisestä. Yritetään lukea foo tiedosto ja baari käyttämällä Solmu.js synkroninen toiminto readFileSync.

JavaScript-koodi

Tämä on silmukoitu GIF. Kuten näet, JS-moottori odottaa, kunnes ensimmäinen kutsu kohdassa readFileSync on valmis. Mutta näin ei tapahdu, koska ei ole olemassa foo tiedostossa, joten toista funktiota ei koskaan kutsuta.

Asynkroninen käyttäytyminen

JS voi kuitenkin olla myös lukkiutumaton ja käyttäytyä kuin se olisi monisäikeinen. Se tarkoittaa, että se ei odota API-kutsun vastausta, I/O-tapahtumia jne. ja voi jatkaa koodin suorittamista. Tämä on mahdollista JS-moottoreiden ansiosta, jotka käyttävät (konepellin alla) todellisia monisäikeisiä kieliä, kuten C++ (Chrome) tai Rust (Firefox). Ne tarjoavat meille Web API:n selaimen hupun alla tai esim. I/O API Node.js:n alla.

JavaScript-ohjelmointikieli

Yllä olevasta GIF-kuvasta näemme, että ensimmäinen funktio työnnetään kutsupinoon ja Hei suoritetaan välittömästi konsolissa.

Sitten kutsumme setTimeout selaimen WebAPI:n tarjoama toiminto. Se siirtyy kutsupinoon ja sen asynkroniseen takaisinkutsuun. foo toiminto siirtyy WebApin jonoon, jossa se odottaa kutsua, joka tapahtuu 3 sekunnin kuluttua.

Sillä välin ohjelma jatkaa koodia ja näemme, että Hei. Minua ei ole estetty konsolissa.

Kun sitä kutsutaan, jokainen WebAPI-jonossa oleva toiminto siirtyy komentosarjaan Takaisinkutsujono. Siinä funktiot odottavat, kunnes kutsupino on tyhjä. Kun se tapahtuu, ne siirretään sinne yksi kerrallaan.

Joten, kun meidän setTimeout ajastin lopettaa lähtölaskennan, meidän foo funktio menee takaisinkutsujonoon, odottaa kunnes kutsupino tulee saataville, menee sinne, suoritetaan ja näemme, että Hei asynkronisesta takaisinkutsusta konsolissa.

Tapahtumasilmukka

Kysymys kuuluu, mistä runtime tietää, että kutsupino on tyhjä, ja miten kutsujonossa oleva tapahtuma kutsutaan? Tapahtumasilmukka. Se on osa JS-moottoria. Tämä prosessi tarkistaa jatkuvasti, onko kutsupino tyhjä, ja jos on, se seuraa, onko callback-jonossa tapahtuma, joka odottaa kutsua.

Siinä kaikki taika kulissien takana!

Teorian kiteyttäminen

Rinnakkaisuus ja rinnakkaisuus

Samanaikaisuus tarkoittaa useiden tehtävien suorittamista samanaikaisesti mutta ei samanaikaisesti. Esim. kaksi tehtävää toimii päällekkäisinä ajanjaksoina.

Rinnakkaisuus tarkoittaa kahden tai useamman tehtävän suorittamista samanaikaisesti, esimerkiksi useiden laskutoimitusten suorittamista samanaikaisesti.

Kierteet ja prosessit

Kierteet ovat koodin suoritusjaksoja, jotka voidaan suorittaa toisistaan riippumatta.

Prosessi on käynnissä olevan ohjelman instanssi. Ohjelmalla voi olla useita prosesseja.

Synkroninen ja asynkroninen

Osoitteessa synkroninen ohjelmoinnissa tehtävät suoritetaan peräkkäin. Kukin tehtävä odottaa, että edellinen tehtävä on valmis, ja se suoritetaan vasta sitten.

Osoitteessa asynkroninen ohjelmointi, kun yksi tehtävä on suoritettu, voit siirtyä toiseen tehtävään odottamatta edellisen tehtävän valmistumista.

Synkroninen ja asynkroninen yksisäikeisessä ja monisäikeisessä ympäristössä

Synkroninen yhden säikeen kanssa: Tehtävät suoritetaan yksi toisensa jälkeen. Kukin tehtävä odottaa edellisen tehtävän suorittamista.

Synkroninen useiden säikeiden kanssa: Tehtävät suoritetaan eri säikeissä, mutta ne odottavat muita suoritettavia tehtäviä missä tahansa toisessa säikeessä.

Asynkroninen yhdellä säikeellä: Tehtäviä aletaan suorittaa odottamatta toisen tehtävän valmistumista. Tiettynä aikana voidaan suorittaa vain yksi tehtävä.

Asynkroninen useilla säikeillä: Tehtävät suoritetaan eri säikeissä odottamatta muiden tehtävien valmistumista ja suorittavat suorituksensa itsenäisesti.

JavaScript-luokitus

Jos tarkastelemme, miten JS-moottorit toimivat konepellin alla, voimme luokitella JS:n asynkroniseksi ja yksisäikeiseksi tulkatuksi kieleksi. Sana "tulkittu" on erittäin tärkeä, koska se tarkoittaa, että kieli on aina ajasta riippuvainen eikä koskaan yhtä nopea kuin käännetyt kielet, joissa on sisäänrakennettu monisäikeistäminen.

Huomionarvoista on, että Node.js:llä voidaan toteuttaa todellista monisäikeistystä edellyttäen, että jokainen säie käynnistetään erillisenä prosessina. Tätä varten on olemassa kirjastoja, mutta Node.js:ssä on sisäänrakennettu ominaisuus nimeltä Työntekijän langat.

Kaikki tapahtumasilmukan GIF-kuvat tulevat Luuppi Philip Robertsin luoma sovellus, jossa voit testata asynkronisia skenaarioita.

Lue lisää:

Miksi sinun pitäisi (luultavasti) käyttää Typescriptiä?

Laatu ensin! 5 helppoa vaihetta koodin niputtamiseen GitHub-työnkulkujen avulla JavaScript-projektissa.

Miten parantaa Vue.js-sovelluksia? Joitakin käytännön vinkkejä

Aiheeseen liittyvät artikkelit

Ohjelmistokehitys

Tulevaisuuden web-sovellusten rakentaminen: The Codest:n asiantuntijatiimin näkemyksiä

Tutustu siihen, miten The Codest loistaa skaalautuvien, interaktiivisten verkkosovellusten luomisessa huipputeknologian avulla ja tarjoaa saumattomia käyttäjäkokemuksia kaikilla alustoilla. Lue, miten asiantuntemuksemme edistää digitaalista muutosta ja liiketoimintaa...

THECODEST
Ohjelmistokehitys

Top 10 Latviassa toimivaa ohjelmistokehitysyritystä

Tutustu Latvian parhaisiin ohjelmistokehitysyrityksiin ja niiden innovatiivisiin ratkaisuihin uusimmassa artikkelissamme. Tutustu siihen, miten nämä teknologiajohtajat voivat auttaa nostamaan liiketoimintaasi.

thecodest
Yritys- ja skaalausratkaisut

Java-ohjelmistokehityksen perusteet: A Guide to Outsourcing Successfully

Tutustu tähän keskeiseen oppaaseen Java-ohjelmistokehityksen onnistuneesta ulkoistamisesta tehokkuuden parantamiseksi, asiantuntemuksen saamiseksi ja projektin onnistumiseksi The Codestin avulla.

thecodest
Ohjelmistokehitys

Perimmäinen opas ulkoistamiseen Puolassa

Ulkoistamisen lisääntyminen Puolassa johtuu taloudellisesta, koulutuksellisesta ja teknologisesta kehityksestä, joka edistää tietotekniikan kasvua ja yritysystävällistä ilmapiiriä.

TheCodest
Yritys- ja skaalausratkaisut

Täydellinen opas IT-tarkastustyökaluihin ja -tekniikoihin

Tietotekniikan tarkastuksilla varmistetaan turvalliset, tehokkaat ja vaatimustenmukaiset järjestelmät. Lue lisää niiden merkityksestä lukemalla koko artikkeli.

Codest
Jakub Jakubowicz teknologiajohtaja ja toinen perustaja

Tilaa tietopankkimme ja pysy ajan tasalla IT-alan asiantuntemuksesta.

    Tietoa meistä

    The Codest - Kansainvälinen ohjelmistokehitysyritys, jolla on teknologiakeskuksia Puolassa.

    Yhdistynyt kuningaskunta - pääkonttori

    • Toimisto 303B, 182-184 High Street North E6 2JA
      Lontoo, Englanti

    Puola - Paikalliset teknologiakeskukset

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Krakova
    • Brain Embassy, Konstruktorska
      11, 02-673 Varsova, Puola

      Codest

    • Etusivu
    • Tietoa meistä
    • Palvelut
    • Tapaustutkimukset
    • Tiedä miten
    • Työurat
    • Sanakirja

      Palvelut

    • Se neuvoa-antava
    • Ohjelmistokehitys
    • Backend-kehitys
    • Frontend-kehitys
    • Staff Augmentation
    • Backend-kehittäjät
    • Pilvi-insinöörit
    • Tietoinsinöörit
    • Muut
    • QA insinöörit

      Resurssit

    • Faktoja ja myyttejä yhteistyöstä ulkoisen ohjelmistokehityskumppanin kanssa
    • Yhdysvalloista Eurooppaan: Miksi amerikkalaiset startup-yritykset päättävät muuttaa Eurooppaan?
    • Tech Offshore -kehityskeskusten vertailu: Tech Offshore Eurooppa (Puola), ASEAN (Filippiinit), Euraasia (Turkki).
    • Mitkä ovat teknologiajohtajien ja tietohallintojohtajien tärkeimmät haasteet?
    • Codest
    • Codest
    • Codest
    • Privacy policy
    • Verkkosivuston käyttöehdot

    Tekijänoikeus © 2025 by The Codest. Kaikki oikeudet pidätetään.

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