Ymmärrystä JavaScript Lupauksia

Johdanto lupauksia

lupaus on yleisesti määritelty välityspalvelimen arvo, joka tulee lopulta saatavilla.

lupaukset ovat yksi tapa käsitellä asynkronista koodia joutumatta callback-helvettiin.

Lupaukset ovat olleet osa kieli vuotta (standardoitu ja käyttöön ES2015), ja on viime aikoina tullut enemmän integroitu, async ja odottavat ES2017.,

Ajastetut toiminnot käyttää lupaa kulissien takana, niin ymmärtää, miten lupaukset työ on olennaista ymmärtää, miten async ja await työtä.

Kuinka lupaukset työstä, lyhyt

Kun lupaus on kutsuttu, se alkaa vireillä olevassa tilassa. Tämä tarkoittaa sitä, että kutsuvan toiminto jatkaa suorittamista, vaikka lupaus on vireillä, kunnes se ratkaisee, jolloin kutsuvan toiminto mitä tietoja oli pyydetty.,

luonut lupaus lopulta on ratkaistu valtion tai hylätty tila, jossa kunkin soittopyyntö toiminnot (siirtynyt then ja catch), kun viimeistely.

mitä JS APIs käyttää lupauksia?

lisäksi oman koodin ja koodi kirjastot, lupaa käytetään standardin modernin Web-käyttöliittymien, kuten:

  • Akku API
  • Hae API
  • Palvelun Työntekijöitä

Se on epätodennäköistä, että nyky-JavaScript-löydät itsesi ole lupaa käyttää, joten aloitetaan sukellus suoraan heille.,

Luo luvata

Lupaus API altistaa Lupaus rakentaja, joka alustaa käyttäen new Promise():

Kuten voit nähdä, lupaus tarkistaa done globaali vakio, ja jos se on totta, lupaus menee ratkaistu valtion (koska resolve soittopyyntö oli nimeltään); muussa tapauksessa reject soittopyyntö on toteutettu, mikä lupaus on hylännyt valtion., (Jos mikään näistä toiminnoista on nimeltään suorituksen polku, lupaus pysyy vireillä valtion)

Käyttäen resolve ja reject emme voi kommunikoida takaisin soittajalle, mitä tuloksena lupaus valtion oli, ja mitä tehdä sen kanssa. Edellä mainitussa tapauksessa palautimme juuri merkkijonon, mutta se voisi olla objekti, tai null myös. Koska olemme luoneet lupaus edellä koodinpätkä, se on jo alkanut suorittamista. Tämä on tärkeää ymmärtää, mitä tapahtuu jaksossa vievää lupaus alla.,

yleisempi esimerkki, johon saatat törmätä, on Promisifying-niminen tekniikka. Tämä tekniikka on tapa pystyä käyttämään klassikko JavaScript-funktio, joka ottaa soittopyynnön, ja se palaa lupaus:

viime versiot Solmu.js, sinun ei tarvitse tehdä tätä, manuaalinen muuntaminen paljon API. On promisifying toiminto saatavilla util moduuli, joka tekee tämän sinulle, koska toiminta olet promisifying on oikea allekirjoitus.,

Kuluttaa lupaus

viime jaksossa, olemme esitelleet miten lupaus on luotu.

nyt katsotaan, miten lupaus voidaan kuluttaa tai käyttää.

Käynnissä checkIfItsDone() tulee määritä toiminnot suoritetaan, kun isItDoneYet lupaus ratkaisee (then puhelu) tai hylkää (catch puhelu).

Ketjutus lupauksia

lupaus voidaan palauttaa uuden lupauksen, luoda ketju lupaa.,

hyvä esimerkki ketjutus lupaa on Noutaa API, jota voidaan käyttää saada resurssi ja jono ketju lupaa suorittaa, kun resurssi on haettu.

Hae API on lupaus-pohjainen mekanismi, ja soittaa fetch() vastaa määritellä oma lupaus käyttäen new Promise().

Esimerkki ketjutus lupauksia

tässä esimerkissä, me kutsumme fetch() saadaksesi luettelon TODO kohteita todos.json tiedosto löytyy verkkotunnuksen juureen, ja luomme ketjun lupaa.,

Käynnissä fetch() palauttaa vastauksen, jossa on monia ominaisuuksia, ja näissä meidän viite:

  • status, numeerinen arvo, joka edustaa HTTP status code
  • statusText, tila-viesti, joka on OK jos pyyntö onnistui

response myös json() metodi, joka palauttaa lupaus, joka ratkaisee sisällön kehon käsitellä ja muuntaa JSON.,

Niin, kun otetaan huomioon ne tilat, tämä on mitä tapahtuu: ensimmäinen lupaus ketjussa on toiminto, että me emme määritelty, kutsutaan status(), joka tarkistaa vastauksen tila ja jos se ei ole onnistunut vastausta (välillä 200 ja 299), se torjuu lupaus.

Tämä toiminta aiheuttaa lupaus ketju ohittaa kaikki kahlittu lupaa luettelossa ja siirry suoraan catch() ilmoitus alareunassa, hakkuut Request failed tekstiä yhdessä virheilmoituksen.,

Jos tämä onnistuu sen sijaan, se kutsuu määrittämäämme json() funktiota. Koska edellinen lupaus, onnistuessaan, palautti response objektin, saamme sen syötteenä toiseen lupaukseen.

tässä tapauksessa, me palauttaa tiedot JSON-käsitelty, joten kolmas lupaus saa suoraan JSON:

.then((data) => { console.log('Request succeeded with JSON response', data)})

ja me yksinkertaisesti kirjautua konsoliin.

Käsittely-virheitä

esimerkissä edellisessä jaksossa, meillä oli catch jotka oli liitetty ketjun lupaa.,

Kun mitään ketju lupaa epäonnistuu ja aiheuttaa virhettä tai hylkää lupaus, ohjaus menee lähimpään catch() selvitys ketjussa.

Css-virheitä

Jos sisälle catch() nostat virhe, voit liittää toisen catch() käsitellä sitä, ja niin edelleen.

new Promise((resolve, reject) => { throw new Error('Error')}) .catch(err => { throw new Error('Error') }) .catch(err => { console.error(err) })

Orchestrating lupauksia

Lupaus.,kaikki()

Jos sinun täytyy synkronoida eri lupaa, Promise.all() avulla voit määrittää luettelon lupauksia, ja suorittaa jotain, kun ne ovat kaikki ratkaistu.

Esimerkki:

ES2015 tuhoa tehtävän syntaksin avulla voit myös tehdä

Promise.all().then(() => { console.log('Results', res1, res2)})

Et ole rajoitettu käyttämään fetch tietenkin, mitään lupausta voidaan käyttää tällä tavalla.

lupaus.,race()

Promise.race() toimii, kun ensimmäinen lupaa sinulle pass se ratkaisee, ja se toimii kiinnitetty soittopyynnön vain kerran, tuloksena ensimmäinen lupaus ratkaistu.,

Esimerkki:

Yleisiä virheitä

Uncaught Tyyppivirhe: määrittelemätön ei ole lupaus

Jos saat Uncaught TypeError: undefined is not a promise virhe konsoli, varmista, että käytät new Promise() sijasta Promise()

UnhandledPromiseRejectionWarning

Tämä tarkoittaa, että lupaus soitit hylätty, mutta ei ollut catch käytetään käsitellä virhe. Lisää catch jälkeen rikkoneen then hoitaa tämän oikein.

Share

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *