Articles

gyors bevezetés az “ígéretek” és az “aszinkron/várakozás” (új funkciókkal)

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 thenmetó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 finallymó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

athencatché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 thencatch vagy finally módszerek bármelyik előző thencatch 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 stringtí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 resolvea Promisehí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 avalueaz argumentum típusanumber.

ígéret.elutasítás

a Promise.resolvestatikus 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 neveras 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.allSettledstatikus módszer hasonló a Promise.allde 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 PromiseFulfilledResultswitch/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.