Articles

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.

(lupaus.ts)

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.

(tsconfig.json)

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

thencatch 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ää thencatch tai finally menetelmät mihin tahansa aikaisempaan thencatch 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.

(lupaus-ketjutus.ts)

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.

(promise-resolve.ts)

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.ts)

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

(lupaus-kaikki.ts)

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.

(promise-all-reject.ts)

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

(lupaus-kaikki-ratkaistu.ts)

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.

/div>

(promise-all-settled.ts)

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.

(lupaus-kisa.ts)

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 paljon Promise.race, mutta se odottaa, kunnes ensimmäinen lupaus onnistuu ratkaisemaan. Tämä menetelmä heittää AggregateError poikkeuksen, jos kaikki lupaukset hylätään.