Úvod do slibů
slib je běžně definován jako proxy pro hodnotu, která bude nakonec k dispozici.
sliby jsou jedním ze způsobů, jak se vypořádat s asynchronním kódem, aniž by se zasekl v callback hell.
Sliby byly součástí jazyka pro let (standardizována a zavedena v ES2015), a v poslední době stala více integrované, s async a await v ES2017.,
Asynchronní funkce pomocí sliby v zákulisí, takže pochopení toho, jak slibuje práci je zásadní pro pochopení toho, jak async
await
práce.
jak sliby fungují, stručně
jakmile bude slib zavolán, začne v čekajícím stavu. To znamená, že funkce volání pokračuje v provádění, zatímco slib čeká, dokud se nevyřeší, což dává funkci volání bez ohledu na požadovaná data.,
vytvořil slíbit, že nakonec skončí ve vyřešeném stavu, nebo v zamítnuta státu, volá příslušné funkce zpětného volání (předán do then
catch
), na dokončení.
které API JS používají sliby?
kromě vlastního kódu a knihoven kódu, sliby jsou používány standardní moderní Webové rozhraní Api, jako jsou:
- Baterie API
- Fetch API
- provozní Pracovníci
je nepravděpodobné, že v moderním Javascriptu najdete sami pomocí slibů, takže pojďme začít potápění přímo do nich.,
Vytváření slib
Slib API vystavuje Slib konstruktor, který inicializaci pomocí new Promise()
:
Jak můžete vidět, slib kontroly done
globální konstantní, a pokud je to pravda, slib, který jde do vyřešeném stavu (od resolve
zpětné volání byl nazýván); v opačném případě, reject
zpětného volání je spuštěn, uvedení slib v zamítnuta státu., (Pokud žádná z těchto funkcí se nazývá v provedení cestě, slib, že zůstanou ve stavu čekající na vyřízení) na
Pomocí resolve
reject
, můžeme komunikovat zpět k volajícímu, co výsledný slib, že stát byl, a co s tím dělat. Ve výše uvedeném případě jsme právě vrátili řetězec, ale mohl by to být objekt nebo null
. Protože jsme vytvořili slib ve výše uvedeném úryvku, již začal plnit. To je důležité pochopit, co se děje v sekci spotřebovává slib níže.,
běžnějším příkladem, se kterým se můžete setkat, je technika zvaná Promisifying. Tato technika je způsob, jak být schopen použít klasický JavaScript funkce, která vyžaduje zpětné volání, a to vrátit slib:
V posledních verzích Uzlu.js, nebudete muset dělat tuto manuální konverzi pro mnoho API. V modulu util je k dispozici funkce promisifying, která to udělá za vás, vzhledem k tomu, že funkce, kterou slibujete, má správný podpis.,
v poslední části jsme představili, jak je vytvořen slib.
nyní se podívejme, jak lze příslib spotřebovat nebo použít.
Běh checkIfItsDone()
bude specifikovat funkce pro spuštění, když isItDoneYet
slib řeší (v then
volání) nebo zamítne (v catch
volání).
řetězení sliby
slib může být vrácen do jiného slibu, vytváří řetězec slibů.,
skvělým příkladem řetězení slibů je Fetch API, které můžeme použít k získání zdroje a fronty řetězce slibů k provedení, když je zdroj načten.
Fetch API je slib-založený mechanismus, a volání fetch()
je ekvivalentní k definování vlastní slib pomocí new Promise()
.
Příklad řetězení sliby
V tomto příkladu, budeme říkat fetch()
získat seznam TODO položky z todos.json
soubor nalezen v kořenové domény, a jsme vytvořit řetěz sliby.,
Běh fetch()
vrátí odpověď, která má mnoho vlastností, a v těch, které jsme odkaz:
-
status
, číselná hodnota reprezentující stavový kód HTTP -
statusText
, zpráva o stavu, což jeOK
pokud žádost uspěl
response
má také json()
metoda, která vrací slib, že vyřeší s obsahem tělo zpracovány a transformovány do formátu JSON.,
vzhledem k tomu, tyto prostory, stane se toto: první slib v řetězci je funkce, které jsme definovali, se nazývá status()
, který kontroluje stav odpovědi a pokud to není úspěšná odpověď (mezi 200 a 299), odmítá slib.
Tato operace způsobí, že slib řetěz přeskočit všechny zřetězené sliby uvedené a bude přeskočit přímo do catch()
prohlášení v dolní části, protokolování Request failed
text spolu s chybovou zprávou.,
pokud to místo toho uspěje, zavolá funkci json()
, kterou jsme definovali. Vzhledem k tomu, že předchozí slib, když byl úspěšný, vrátil objekt response
, dostaneme jej jako vstup do druhého slibu.
V tomto případě jsme se vrátit data JSON zpracované, takže třetí slib přijímá JSON přímo:
.then((data) => { console.log('Request succeeded with JSON response', data)})
a my se jen přihlásit se do konzole.
chyby při manipulaci
v příkladu jsme v předchozí části měli catch
, který byl připojen k řetězci slibů.,
Když něco v řetězci slibů selže a vyvolá chybu nebo odmítne slib, ovládání přejde do nejbližšíhocatch()
dolů řetězce.
Kaskádové chyb
uvnitř catch()
zvýšit chybu, můžete přidat druhý catch()
to zvládnout, a tak dále.
Orchestrating promises
Promise.,všechny()
Pokud potřebujete synchronizovat různé sliby, Promise.all()
vám pomůže definovat seznam slibuje, a spustit něco, když jsou všechny vyřešeny.
Příklad:
ES2015 destructuring syntaxe přiřazení umožňuje také udělat
Promise.all().then(() => { console.log('Results', res1, res2)})
Ty nejsou omezeny na používání fetch
samozřejmě, že jakýkoli slib, že mohou být použity v této módě.
slib.,závod()
Promise.race()
se spustí při první sliby, které jste projít, aby se to řeší, a to běží připojené zpětné volání jen jednou, s výsledkem první slib vyřešen.,
Příklad:
Běžné chyby
Uncaught TypeError: undefined není slib
Když se dostanete Uncaught TypeError: undefined is not a promise
chyba v konzoli, ujistěte se, že používáte new Promise()
místo Promise()
UnhandledPromiseRejectionWarning
To znamená, že slib, který jsi volal zamítnuta, ale tam byl žádný catch
používá se pro zpracování chyby. Přidejte catch
po přestupku then
, abyste to správně zvládli.