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 onOKjos 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.