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