Az ígéret a Promise
osztály (konstruktor) egy példánya (objektuma). Az ígéret létrehozásához a new Promise(executor)
szintaxist használjuk, és argumentumként egy végrehajtó függvényt adunk meg. Ez a végrehajtó funkció eszközt biztosít az ígéret felbontásának vagy elutasításának viselkedésének ellenőrzésére.
a TypeScript – ben megadhatjuk a visszaadott érték adattípusát, amikor az ígéret teljesül. Mivel az ígéret által visszaadott hiba bármilyen formát ölthet, az ígéret elutasításakor visszaadott érték alapértelmezett adattípusa any
A gépírással.
Az ígéret felbontási érték típusának megjegyzéséhez általános típusú deklarációt használunk. Alapvetően egy típust ígér Promise
konstruktorral new Promise<Type>()
formájában, amely jelzi az ígéret megoldott értéktípusát. De használhatja a let p: Promise<Type> = new Promise()
szintaxist is, hogy elérje ugyanezt.
a generikus osztályokat részletesen tárgyaltuk a generikus leckében.
(ígéret.ts) a fenti példában a findEven
egy ígéret, amelyet a Promise
konstruktor segítségével hoztak létre, amely 1 másodperc után oldódik meg. Ennek az ígéretnek a megoldott adattípusa a number
, ezért a TypeScript fordító nem engedélyezi a resolve
függvény hívását, amelynek értéke nem a number
.
Az ígéret elutasítási értékének alapértelmezett típusa any
, ezért a reject
függvény hívása bármilyen értékkel legális. Ez a TypeScript alapértelmezett viselkedése, és a vitafonalat itt találja, ha saját véleménye van.
mivel megadtuk a number
mint a sikeres ígéretfeloldás adattípusát, a TypeScript fordító megadja a number
írja be a value
Argumentumát then
visszahívási módszer.
a then
metódusban megadott visszahívás akkor kerül végrehajtásra, amikor az ígéret megoldódott, a catch
metódusban megadott visszahívás pedig akkor kerül végrehajtásra, amikor elutasítja vagy valamilyen hiba történik az ígéret megoldása közben. A finally
metódus regisztrál egy visszahívást, amely végrehajtja, amikor az ígéret feloldódik vagy Elutasít.
Ha a TypeScript fordító panaszkodik a finally
módszerre, ez azt jelenti, hogy a TypeScript fordító nem importálja a finally
módszer típusdefinícióit. Ezt a módszert az ES2016-ban vezették be, ezért teljesen új. Az ebben a leckében használt Promise API egyéb jellemzői meglehetősen újak, ezért győződjön meg arról, hogy a tsconfig.json
fájlban az összes új könyvtár be van töltve.
(tsconfig.json) Az én tsconfig.json
, betöltöttem a ES2020
standard könyvtár. Ez támogatja az összes JavaScript funkciót az ES2020-ig. Ha többet szeretne tudni a tsconfig.json
fájlról vagy szabványos könyvtárakról, kérjük, olvassa el a fordítási leckét (hamarosan).
ígéret láncolás
athen
catch
ésfinally
módszerek implicit módon adnak vissza ígéretet. A visszahívási függvények által visszaadott bármely érték egy ígérettel van becsomagolva és visszaküldve, beleértve a undefined
értéket. Ez az implicit ígéret alapértelmezés szerint megoldódik, kivéve, ha szándékosan új ígéretet ad vissza ezekből a módszerekből, amelyek kudarcot vallhatnak.
ezért hozzá lehet fűzni then
catch
vagy finally
módszerek bármelyik előző then
catch
vagy finally
módszer. Ha egy implicit ígéretet ezen módszerek egyikével adnak vissza, akkor ennek az implicit ígéretnek a megoldott értéktípusa a visszaadott érték típusa. Lássunk egy gyors példát.
(ígéret-láncolás.ts) módosítottuk az előző példát, és hozzáadtunk egy másik then
metódust az első then
metódushoz. Mivel az első then
metódus string
típusú értéket ad vissza, az ezzel a módszerrel visszaadott implicit ígéret a string
típusú értékkel oldódik meg. Ezért a másodikthen
módszer megkapja avalue
típusú argumentumotstring
amint az az eredményekből látható.
ígéret.resolve
a resolve
a Promise
hívás statikus metódusa egy már sikeresen megoldott ígéretet ad vissza a Promise.resolve(value)
hívásban megadott értékkel. Ez egyszerűbb, mint az Ígérethívás új példányának létrehozása és a logika hozzáadása az ígéret azonnali megoldásához.
(ígéret-feloldás. amint a fenti eredményekből látható, aPromise.resolve(value)
a hívás mindig azonnal feloldódik egynumber
érték avalue
az argumentum típusanumber
.
ígéret.elutasítás
a Promise.resolve
statikus módszerhez hasonlóan a Promise.reject(error)
módszer mindig elutasított ígéretet ad vissza. Az ígéret elutasításának értéke a error
argumentumból származik, típusa pedig any
.
(ígéret-elutasítás.ts) a Promise.reject
módszer által visszaadott ígéret típusa Promise<never>
mivel ez az ígéret soha nem oldódik meg, így nem lesz ígéret felbontási értéke. Ezért az ígéret által megoldott érték típusa never
as never
azt az értéket jelöli, amely soha nem fordul elő.
ígéret.minden
egyes esetekben több ígérettel van dolgod. Ha visszahívási funkciót szeretne végrehajtani, amikor az összes ígéret sikeresen megoldódott, használja a Promise.all
statikus módszert.
var pAll = Promise.all()pAll.then( ( ) => {___});
a Promise.all
módszer egy tömb (pontosan iterálható) ígéreteket ad vissza egy új ígéretet. A visszaadott ígéret pAll
akkor oldódik meg, ha az összes ígéret p1, p2, ...
sikeresen megoldódott. Ezt az ígéretet egy tömb értékkel oldják meg, amely a p1, p2, ...
ígéretfelbontási értékeit tartalmazza megjelenésük sorrendjében.
(ígéret-minden.ts) amint a fenti példából látható, Promise.all
a módszer általános, és a típust veszi fel az egyes ígéretek által megoldott érték. Általános típus megadása nagyon hasznos, ha ennek a kollektív ígéretnek a megoldott értékét használjuk, amint az a fenti eredményből látható.
a Promise
osztály statikus módszereinek többsége általános, amint azt az alábbi példák mutatják.
van egy figyelmeztetés aPromise.all
. Végrehajtja a fail-fast mechanizmust, ami azt jelenti ,hogy ha bármelyik bemeneti ígéretp1, p2, ...
elutasításra kerül,pAll
elutasításra kerül. Ha nem várja meg, hogy más függőben lévő ígéretek megoldódjanak.
(promise-all-reject.ts) amint a fenti eredményből látható, mivel a 3.ígéretet 1 másodperc után elutasították, a allPromise
azonnal elutasították.
ígéret.allSettled
a Promise.allSettled
statikus módszer hasonló a Promise.all
de ellentétben a Promise.all
– vel, megvárja, amíg az összes ígéret rendeződik (ami azt jelenti, amíg azok megoldódnak vagy elutasításra kerülnek). Ezért a Promise.allSettled
által visszaadott ígéret soha nem utasítja el (de az alábbi példában egyébként hozzáadtuk a catch
blokkot).
(promise-all-settled.ts) munka promise.allSettled
lehet egy kicsit nyomasztó, mint akkor a fenti program és annak eredményét. Először is, allSettle
metódus egy ígéretet ad vissza, amely a PromiseSettledResult<type>
értékek tömbjével oldódik meg, amikor az összes ígéret rendeződik. A type
A bemeneti ígéret típusából származik. A PromiseSettledResult
típus az alábbiak szerint néz ki.
ezeket a típusokat a TypeScript szabványos Könyvtára biztosítja. Tehát amikor egy ígéret feloldódik, aallSettled
metódus átalakítja az értékétPromiseFulfilledResult
alakzattá, ha pedig nem sikerül, átalakítjaPromiseRejectedResult
alakzattá. Ezért, amikor a allSettled
megoldódik, ez egy olyan objektumtömb, amelyben minden objektum alakja PromiseFulfilledResult
vagy PromiseRejectedResult
interfész.
mivel a PromiseFulfilledResult
a PromiseFulfilledResult
és PromiseRejectedResult
közös status
a literális adattípus tulajdonsága, diszkriminánsként használhatjuk a PromiseFulfilledResult
switch/case
őr.
a switch/case
típusvédő és megkülönböztető szakszervezetek a Típusrendszer leckében.
(ígéret-minden-rendezett.ts) ígéret.race
a Promise.race
vesz egy tömb (iterálható pontosan) ígéretek és visszaad egy új ígéretet, amely feloldja vagy elutasítja, amint az egyik bemeneti ígéretek feloldja vagy elutasítja. Más szavakkal, a Promise.race
által visszaadott ígéret rendeződik az egyik bemeneti ígéret eredményével, amely gyorsan rendeződik.
(ígéret-verseny.TS) a Promise.all
vagy Promise.allSettled
ellentétben ez a módszer csak az első kiegyenlített ígéret egyetlen értékét adja vissza, ezért a visszaadott ígéret típusa Promise<number>
a fenti esetben. Mivel többek között az 1.ígéret rendeződött először, a then
visszahívás a fastestPromise
500 ms után hívódik meg a megoldott ígéret értékével.
az új Promise.any()
a módszer elérte az ECMAScript javaslat pálya 4.szakaszát. Promise.any
nagyon hasonlít Promise.race
de megvárja, amíg az első ígéret sikeres megoldódik. Ez a módszer egy AggregateError
kivételt dob, ha az összes ígéretet elutasítják.