a Javascript ígéreteinek megértése

Bevezetés az ígéretekhez

az ígéretet általában proxyként definiálják egy olyan értékhez, amely végül elérhetővé válik.

Az ígéretek az aszinkron kód kezelésének egyik módja, anélkül, hogy elakadnának a visszahívási pokolban.

Az ígéretek évek óta a nyelv részét képezik (szabványosítva és bevezetve az ES2015-ben), és az utóbbi időben integráltabbá váltak, az async-vel és az es2017-ben.,

az Async funkciók a színfalak mögötti ígéreteket használják, így a munka ígéreteinek megértése alapvető fontosságú annak megértéséhez, hogy a asyncés await munka.

hogyan működnek az ígéretek, röviden

miután egy ígéretet felhívtak, egy függőben lévő állapotban indul. Ez azt jelenti, hogy a hívásfunkció továbbra is végrehajtódik, míg az ígéret mindaddig függőben van, amíg meg nem oldódik, így a hívó funkció bármilyen adatot kért.,

a létrehozott ígéret végül megoldott állapotban vagy elutasított állapotban ér véget, a megfelelő visszahívási funkciókat hívva (átadva a then és catch).

mely js API-k használják az ígéreteket?

a saját kódja és a könyvtárak kódja mellett az ígéreteket olyan szabványos modern webes API-k is használják, mint például:

  • Az akkumulátor API
  • az API
  • szervizmunkások

nem valószínű, hogy a modern JavaScript-ben nem találja magát ígéretek használatával, ezért kezdjük el a búvárkodást.,

Létrehozása ígéret

Az Ígéret API kiteszi egy Ígéret, kivitelező, ami inicializálja a new Promise():

Mint látható, az ígéret ellenőrzi a done globális állandó, ha ez igaz, az ígéret megy, hogy egy megoldott állam (mivel a resolve visszahívás hívták); ellenkező esetben a reject visszahívás végre, amivel az ígéret a visszautasított állam., (Ha ezen funkciók egyikét sem hívják meg a végrehajtási útvonalban, az ígéret függőben marad)

a resolve és reject használatával kommunikálhatunk a hívóval, hogy mi volt a kapott ígéret állapota, és mit tegyünk vele. A fenti esetben csak vissza egy string, de lehet egy objektum, vagy null is. Mivel a fenti részletben megteremtettük az ígéretet, már megkezdte a végrehajtást. Ez azért fontos, hogy megértsük, mi folyik a szakaszban fogyaszt egy ígéretet alább.,

egy gyakoribb példa, amellyel találkozhat, egy Promisifying nevű technika. Ez a technika egy módja annak, hogy képes legyen használni a klasszikus JavaScript funkció, amely vesz egy visszahívás, és azt vissza ígéretet:

a legújabb verzióiban Node.js, akkor nem kell csinálni ezt a kézi átalakítás egy csomó API. Van egy promisifying funkció áll rendelkezésre az util modul, amely ezt az Ön számára, tekintettel arra, hogy a funkció éppen promisifying a megfelelő aláírás.,

az utolsó szakaszban bemutattuk, hogyan jön létre egy ígéret.

most nézzük meg, hogyan lehet az ígéretet fogyasztani vagy használni.

RunningcheckIfItsDone() megadja a végrehajtandó funkciókat, amikor azisItDoneYet ígéret feloldódik (athen hívás) vagy elutasítja (acatch hívás).

az ígéretek láncolása

egy ígéretet vissza lehet adni egy másik ígérethez, létrehozva az ígéretek láncát.,

egy nagyszerű példa a láncolás ígéretek a Fetch API, amely tudjuk használni, hogy egy erőforrás, majd sorban egy lánc ígéret, hogy végre, amikor az erőforrás lekérése.

a Fetch API egy ígéret alapú mechanizmus, és a fetch() meghívása megegyezik a saját ígéretünk meghatározásával a new Promise()használatával.

példa a láncolás ígéretek

ebben a példában, hívjuk fetch(), hogy egy listát a TODO elemeket a todos.json fájl található a domain gyökér, és hozzunk létre egy lánc az ígéretek.,

Fut fetch() visszatér egy válasz, amely számos tulajdonságok parancsra, majd azokon belül mi hivatkozás:

  • status, egy számérték, ami a HTTP státusz kód
  • statusText, egy állapotüzenet, ami OK ha a kérelem sikerült

response is van egy json() módszer, ami visszatér egy ígéret, hogy megoldja a tartalom, a test feldolgozott, illetve átalakult JSON.,

tehát tekintettel ezekre a helyiségekre, ez történik: a lánc első ígérete egy olyan függvény, amelyet definiáltunk, az úgynevezett status(), amely ellenőrzi a válasz állapotát, és ha nem sikeres válasz (200 és 299 között), elutasítja az ígéretet.

Ez a művelet miatt az ígéretlánc kihagyja a felsorolt láncolt ígéreteket, majd közvetlenül a utasításra ugrik alul, naplózva a Request failed szöveget a hibaüzenettel együtt.,

Ha ez sikerrel jár, akkor az általunk definiált json() függvényt hívja. Mivel az előző ígéret, amikor sikeres volt, visszaadta a objektumot, a második ígéret bemeneteként kapjuk meg.

ebben az esetben visszaküldjük a JSON által feldolgozott adatokat, így a harmadik ígéret közvetlenül megkapja a JSON-t:

.then((data) => { console.log('Request succeeded with JSON response', data)})

és egyszerűen bejelentkezünk a konzolba.

kezelési hibák

a példában az előző szakaszban volt egy catch, amelyet az ígéretek láncához csatoltak.,

Ha az ígéretek láncában bármi meghibásodik, hibát vet fel, vagy elutasítja az ígéretet, akkor a vezérlés a legközelebbi nyilatkozatra kerül.

Cascading errors

Ha a catch()belsejében hibát emel, akkor hozzáfűz egy második a kezeléshez stb.

new Promise((resolve, reject) => { throw new Error('Error')}) .catch(err => { throw new Error('Error') }) .catch(err => { console.error(err) })

ígéret.,minden ()

ha különböző ígéreteket kell szinkronizálni, a Promise.all() segít meghatározni az ígéretek listáját, és végrehajtani valamit, ha azok mind megoldódnak.

példa:

az ES2015 destructuring assigment szintaxis lehetővé teszi, hogy is csinálni

Promise.all().then(() => { console.log('Results', res1, res2)})

Ön nem korlátozódik a fetch természetesen bármilyen ígéretet lehet használni ebben a módon.

ígéret.,race ()

Promise.race() fut, amikor az első ígéretek, amelyeket átadsz neki, megoldódik, és csak egyszer futtatja a csatolt visszahívást, az első ígéret eredményével megoldva.,

példa:

gyakori hibák

Uncaught TypeError: undefined nem ígéret

ha megkapja a Uncaught TypeError: undefined is not a promise hibát a konzolon, győződjön meg róla, hogy a new Promise() helyett csak Promise()

unhandledpromiserejectionwarning

Ez azt jelenti, hogy egy ígéret hívott elutasított, de nem volt catch a hiba kezelésére. Add hozzá acatch után a jogsértőthen kezelni ezt megfelelően.

Share

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük