porozumění slibům JavaScript

Ú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ž je OK 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.

Share

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *