nopea johdatus ”lupauksiin” ja”Async/odottaa”(uusilla ominaisuuksilla)
lupaus on Promise
luokan (rakentaja) instanssi (objekti). Luodaksemme lupauksen käytämme new Promise(executor)
syntaksia ja tarjoamme argumenttina suorittajan funktion. Tämä executor-toiminto tarjoaa keinon hallita lupauksemme päätöslauselman tai hylkäämisen käyttäytymistä.
Konekirjoituksessa voidaan ilmoittaa palautetun arvon tietotyyppi, kun lupaus täyttää. Koska lupauksen palauttama virhe voi saada minkä muodon tahansa, lupauksen hylkäämisen yhteydessä palautetun arvon oletustietotyypiksi asetetaan any
Konekirjoituksella.
antaaksemme huomautuksen lupauksen resoluutioarvotyypistä, käytämme yleisilmoitusta. Periaatteessa lupaat tyypin Promise
konstruktori muodossa new Promise<Type>()
, joka ilmaisee lupauksen ratkaistun arvotyypin. Mutta voit myös käyttää let p: Promise<Type> = new Promise()
syntaksia saavuttaaksesi saman.
💡 olemme käsitelleet geneerisiä luokkia yksityiskohtaisesti Generiikan oppitunnilla.
yllä olevassa esimerkissä findEven
on lupaus, joka luotiin käyttämällä Promise
konstruktoria, joka ratkeaa 1 sekunnin jälkeen. Tämän lupauksen selvitetty tietotyyppi on number
, joten TypeScript-kääntäjä ei salli kutsua resolve
funktiota, jonka arvo on muu kuin tyyppinumeron arvo number
.
lupauksen hylkäysarvon oletustyyppi on any
, joten reject
funktio millä tahansa arvolla on laillinen. Tämä on Typescriptin oletuskäyttäytyminen, ja löydät keskustelulangan täältä, jos sinulla on omia mielipiteitä.
koska olemme toimittaneet number
onnistuneen lupaustarkkuuden tietotyypiksi, TypeScript-kääntäjä antaa number
tyypin value
argumentin then
takaisinsoittomenetelmä.
then
– menetelmässä annettu takaisinkutsu suoritetaan, kun lupaus on ratkaistu, ja catch
– menetelmässä annettu takaisinkutsu suoritetaan, kun se hylkää tai jokin virhe ratkaistaessa lupausta. finally
menetelmä rekisteröi takaisinsoiton, joka suoritetaan, kun lupaus joko ratkaisee tai hylkää.
Jos TypeScript-kääntäjä valittaa finally
– menetelmästä, se tarkoittaa, että TypeScript-kääntäjä ei tuo tyyppimäärityksiä finally
– menetelmälle. Tämä menetelmä otettiin käyttöön ES2016: ssa, joten se on melko uusi. Tällä oppitunnilla käytetyn Lupausrajapinnan muut ominaisuudet ovat melko uusia, joten varmista, että tsconfig.json
tiedostoon on ladattu kaikki uudet kirjastot.
minun tsconfig.json
olen ladannut ES2020
standardikirjaston. Tämä tukee kaikkia JavaScript-ominaisuuksia ES2020 asti. Jos haluat tietää lisää tsconfig.json
tiedosto-tai standardikirjastoista, Lue Koostetunti (tulossa pian).
Lupausketjut
then
catch
ja finally
menetelmät palauttavat lupauksen implisiittisesti. Kaikki näiden takaisinsoittofunktioiden palauttamat arvot paketoidaan lupauksella ja palautetaan, mukaan lukien undefined
. Tämä implisiittinen lupaus ratkeaa oletusarvoisesti, ellet tietoisesti palauta uutta lupausta näistä menetelmistä, jotka voivat epäonnistua.
Näin voit liittää then
catch
tai finally
menetelmät mihin tahansa aikaisempaan then
catch
tai finally
method. Jos implisiittinen lupaus palautetaan jollakin näistä menetelmistä, tämän implisiittisen lupauksen ratkaistun Arvon tyyppi on palautetun Arvon tyyppi. Katsotaanpa nopea esimerkki.
olemme muokanneet edellistä esimerkkiä ja lisänneet toisen then
method to the first then
method. Koska ensimmäinen then
menetelmä palauttaa tyypin arvon string
, tällä menetelmällä palautettu implisiittinen lupaus ratkaistaan tyypin arvolla string
. Näin ollen toinen then
menetelmä saa value
tyypin string
, kuten tuloksista näkyy.
lupaus.resolve
resolve
staattinen Promise
puhelu palauttaa lupauksen, joka on jo ratkaistu onnistuneesti arvolla, jonka annat Promise.resolve(value)
puhelu. Tämä on helpompaa kuin luoda uusi esimerkki Lupauskutsu ja lisäämällä logiikkaa ratkaista lupaus välittömästi.
kuten yllä olevista tuloksista näkyy, Promise.resolve(value)
kutsu ratkaisee aina heti number
arvo koska value
argumentin tyyppi on number
.
lupaus.hylkää
samanlainen kuin Promise.resolve
staattinen menetelmä, Promise.reject(error)
menetelmä palauttaa aina hylätyn lupauksen. Lupauksen hylkäyksen arvo on otettu error
argumentista ja sen tyyppi on any
.
Promise.reject
menetelmä on Promise<never>
, koska tämä lupaus ei koskaan toteudu, joten lupauksen resoluutioarvoa ei tule. Näin ollen lupauksella ratkaistun Arvon tyyppi on never
kuten never
merkitsee arvoa, jota ei koskaan tapahdu.
lupaus.kaikissa
joissakin skenaarioissa on kyse useista lupauksista. Jos haluat suorittaa takaisinkutsutoiminnon, kun kaikki lupaukset on ratkaistu onnistuneesti, käytä Promise.all
staattinen menetelmä.
var pAll = Promise.all()pAll.then( ( ) => {___});
Promise.all
menetelmä ottaa joukon (iteroitavissa tarkasti) lupauksia ja palauttaa uuden lupauksen. Palautettu lupaus pAll
ratkeaa, kun kaikki lupaukset p1, p2, ...
ratkeavat onnistuneesti. Tämä lupaus ratkaistaan array-arvolla, joka sisältää lupauksen resoluutioarvot p1, p2, ...
niiden esiintymisjärjestyksessä.
kuten yllä olevasta esimerkistä näkyy, Promise.all
menetelmä on yleinen ja se ottaa tyypin, joka ratkaisee jokaisen sille annetun lupauksen. Yleisen tyypin tarjoaminen on varsin hyödyllistä, kun käytämme tämän yhteisen lupauksen ratkaisevaa arvoa, kuten näet yllä olevasta tuloksesta.
💡 suurin osa
Promise
luokan staattisista menetelmistä on yleisiä, kuten alla olevista esimerkeistä käy ilmi.
on yksi varoitus, jossa Promise.all
. Se toteuttaa fail-fast-mekanismin, joka tarkoittaa, että jos jokin syötön lupauksista p1, p2, ...
hylätään, pAll
hylätään. If ei odota muiden vireillä olevien lupausten ratkeamista.
kuten yllä olevasta tuloksesta näkyy, koska kolmoslupaus hylättiin heti 1 sekunnin jälkeen, allPromise
hylättiin välittömästi.
lupaus.allsetted
Promise.allSettled
staattinen menetelmä on samanlainen kuin Promise.all
, mutta toisin kuin Promise.all
, se odottaa, kunnes kaikki lupaukset on ratkaistu (eli kunnes ne ratkaistaan tai hylätään). Siksi Promise.allSettled
palauttama lupaus ei tule koskaan hylkäämään (mutta olemme lisänneet catch
Blockin alla olevaan esimerkkiin joka tapauksessa).
työskentely promise.allSettled
voi olla hieman häkellyttävää, kuten yllä olevasta ohjelmasta ja sen tuloksesta voi päätellä. Ensinnäkin allSettle
method palauttaa lupauksen, joka ratkeaa joukon PromiseSettledResult<type>
arvoja, kun kaikki lupaukset on ratkaistu. type
on johdettu syöttölupauksen tyypistä. PromiseSettledResult
tyyppi näyttää alla.
näitä tyyppejä tarjoaa Typescriptin standardikirjasto. Niinpä kun lupaus ratkeaa, allSettled
method muuntaa sen arvon PromiseFulfilledResult
muotoon ja kun se epäonnistuu, se muuntaa sen PromiseRejectedResult
muotoon. Siksi kun allSettled
ratkeaa, on kyseessä joukko olioita, joissa jokaisen olion muoto on PromiseFulfilledResult
tai PromiseRejectedResult
liittymä.
koska PromiseFulfilledResult
on PromiseFulfilledResult
ja PromiseRejectedResult
jolla on yhteinen status
kirjaimellisen tietotyypin ominaisuus, Voimme käyttää sitä diskriminanttina switch/case
vartija.
We olemme puhuneet
switch/case
tyypin vartioinnista ja erottelevista liitoista Tyyppijärjestelmän oppitunnilla.
lupaus.race
Promise.race
ottaa joukon (iteroitavissa tarkasti) lupauksia ja palauttaa uuden lupauksen, joka ratkaisee tai hylkää heti kun yksi syötetyistä lupauksista ratkeaa tai hylätään. Toisin sanoen Promise.race
palauttama lupaus ratkaistaan yhden syöttölupauksen tuloksella, joka asettuu nopeasti.
toisin kuin Promise.all
tai Promise.allSettled
, tämä menetelmä palauttaa vain yhden ensimmäisen vakiintuneen lupauksen arvon, joten palautetun lupauksen tyyppi on Promise<number>
edellä mainitussa tapauksessa. Koska 1. lupaus asettui ensin muiden joukkoon, then
takaisinsoitto fastestPromise
saa kutsun 500 metrin jälkeen ratkaistun lupauksen arvolla.
new Uusi
Promise.any()
menetelmä on edennyt ECMAScript-ehdotuskappaleen vaiheeseen 4.Promise.any
muistuttaa paljonPromise.race
, mutta se odottaa, kunnes ensimmäinen lupaus onnistuu ratkaisemaan. Tämä menetelmä heittääAggregateError
poikkeuksen, jos kaikki lupaukset hylätään.