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, amiOK
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.