Javascript belooft tutorial met voorbeelden

  • Ronald Ferguson
  • 0
  • 1278
  • 103
>

Hoewel ze voorheen beschikbaar waren via bibliotheken van derden, werden beloften geïntroduceerd in Javascript, als een native feature, met ECMAScript6.

Ze bieden een alternatief voor callbacks bij het omgaan met asynchrone code, en bieden onder andere een schonere manier om fouten af ​​te handelen. In deze tutorial zullen we zien hoe beloften werken, hoe ze gemaakt kunnen worden en hoe ze hun methodes kunnen gebruiken.

In deze tutorial leer je:
  • Wat is een Javascript-belofte.
  • Hoe u een Javascript-belofte maakt.
  • Hoe beloften kunnen worden gebruikt om asynchrone code te beheren.
  • Wat zijn de methoden die kunnen worden gebruikt met een belofte.

Gebruikte softwarevereisten en -conventies

Softwarevereisten en Linux Command Line-conventies
Categorie Vereisten, conventies of gebruikte softwareversie
Systeem Besturingssysteem agnostisch.
Software Een installatie van knooppunt om deze tutorial te volgen in een niet-browseromgeving.
Andere Kennis van Javascript en objectgeoriënteerde concepten.
Conventies # - vereist dat gegeven linux-commando's worden uitgevoerd met root-privileges, hetzij direct als rootgebruiker, hetzij door gebruik van sudo opdracht
$ - vereist dat gegeven linux-commando's worden uitgevoerd als een gewone niet-geprivilegieerde gebruiker

Wat is een "belofte"?

In Javascript is een belofte is een object dat wordt geretourneerd als het resultaat van een asynchrone, niet-blokkerende bewerking, zoals bijvoorbeeld degene die wordt uitgevoerd door de halen ingebouwde functie. Beloften werden geïntroduceerd als een native feature, met ECMAScript6: ze vertegenwoordigen een schoner alternatief voor callbacks, dankzij functies zoals methodeketting en het feit dat ze een manier bieden om fouten te beheren die lijkt op het afhandelen van uitzonderingen in synchrone code. Er zijn drie staten waarin een Beloofde zich kan bevinden:

  • In afwachting
  • Opgelost
  • Afgekeurd

Zoals de naam suggereert, zeggen we dat een belofte is in afwachting wanneer het resultaat nog niet is bepaald, dus het kan nog steeds worden opgelost of afgewezen. We zeggen dat een belofte is vervuld wanneer de asynchrone bewerking is geslaagd: de belofte is opgelost en bevat het resultaat van de bewerking zelf. Ten slotte wordt gezegd dat het een belofte is afgekeurd wanneer de asynchrone bewerking mislukt: in dat geval bevat de belofte de reden voor de mislukking.

Een Javascript-belofte maken

Zoals hierboven vermeld, zijn sommige functies die asynchrone bewerkingen uitvoeren, zoals halen, standaard een belofte retourneren, zodat we de methoden en patronen kunnen gebruiken die we later in deze tutorial uit de doos zullen beschrijven. Andere functies ondersteunen nog geen beloften, dus misschien willen we er een belofte omheen creëren. De constructor van een belofte heeft één argument nodig, wat een callback-functie is die zelf twee argumenten heeft: de oplossen en verwerpen callbacks, die worden opgeroepen om de belofte respectievelijk op te lossen of af te wijzen. Laten we een snel voorbeeld bekijken van hoe u een triviale belofte kunt creëren:

const belofte = nieuwe belofte (functie (oplossen, afwijzen) setTimeout (oplossen, 100, 'succes!');); 
Met bovenstaande code hebben we een belofte gecreëerd, die eigenlijk altijd zal worden opgelost, want door gebruik te maken van de setTimeout functie noemen we de oplossen callback na een time-out van 100 milliseconden, waarbij de string "succes!" als het enige argument van de callback. Als we wilden dat de belofte werd afgewezen, hadden we op dezelfde manier een beroep moeten doen op het verwerpen Bel terug. Het is duidelijk dat een belofte zoals hierboven niet erg nuttig voor ons is, dus we zullen nu proberen een belofte te creëren rond een echt nuttige functie.
De readFile methode van de fs module, leest asynchroon de inhoud van een bestand en heeft drie argumenten: twee zijn verplicht en één is optioneel. Het eerste argument is het pad van het te lezen bestand. Het tweede argument is optioneel, en daarmee kunnen we bijvoorbeeld de codering om gebruikt te worden. Het derde argument is een callback-functie, die zelf twee argumenten nodig heeft: vergist en gegevens.
Als de leesbewerking mislukt, bevat het eerste argument een Fout object en de tweede zullen ongedefinieerd zijn; als de bewerking succesvol is, is het tweede argument een tekenreeks die de inhoud van het bestand vertegenwoordigt, of een onbewerkte buffer als er geen codering is opgegeven, terwijl het eerste argument zal zijn nul. Stel bijvoorbeeld dat ik mijn .vimrc bestand met deze functie:

const fs = vereisen ('fs'); fs.readFile ('. vimrc', 'utf-8', functie (err, data) if (err) throw err console.log (data)); 


Allereerst hadden we de fs module en toegewezen aan de fs constant, dan gingen we verder met het aanroepen van de readFile methode. In de callback geaccepteerd als het laatste argument van de functie, voeren we de benodigde bewerkingen uit, afhankelijk van het verkregen resultaat. In de bovenstaande code we gooien een uitzondering als er een fout optreedt bij het lezen van het bestand, terwijl we de inhoud van het bestand gewoon afdrukken als alles naar verwachting verloopt. In dit geval zou dit het (afgekapte) resultaat zijn:

 […] Set fileformat = unix set textwidth = 79 set noswapfile set foldmethod = indent set foldlevel = 99 set splitright set split hieronder set hlsearch set incsearch set ignorecase set smartcase […] 

De methode die we zojuist hebben gebruikt, readFile, voert de leesbewerking asynchroon uit, dus het blokkeert niet. Standaard ondersteunt het echter geen beloften. Als we het gebruik van deze methode willen "beloven", moeten we er zelf een belofte omheen maken:

const fs = vereisen ('fs'); function readFilePromise (bestandspad) retourneer nieuwe belofte (functie (oplossen, weigeren) fs.readFile (bestandspad, 'utf-8', functie (err, gegevens) if (err) weigeren (err); anders oplossen (data);););  

Kijk naar de bovenstaande code, wat hebben we veranderd? We hebben het readFilePromise functie: daarin een belofte gebaseerd op het resultaat van de fs.readFile methode is gemaakt en geretourneerd. In het vorige voorbeeld hebben we de code aangepast om een ​​uitzondering te genereren als er een fout in de leesbewerking aanwezig was: in dit geval noemen we, aangezien we een belofte bouwen, als er een fout optreedt, de verwerpen callback, waarbij de fout als het enige argument wordt doorgegeven en op deze manier de belofte wordt afgewezen. Als de leesbewerking met succes is uitgevoerd, bellen we oplossen, het doorgeven van de gegevens die het resultaat zijn van de leesoperatie als het argument, waardoor de belofte wordt vervuld. In de volgende paragraaf zullen we zien hoe we de belofte die we zojuist hebben gemaakt daadwerkelijk kunnen consumeren.



Belofte methoden

Een Promise-object zou nutteloos zijn als we geen manieren hadden om ermee om te gaan en het te consumeren. In deze sectie zullen we de methoden beschrijven die we kunnen gebruiken op het belofte-object. Elk van deze methoden werkt op een belofte, en geeft op zijn beurt zelf een belofte terug, waardoor we een "stapel" en uitvoeringsmethode kunnen maken ketenen.

De dan methode

De dan methode accepteert twee argumenten, die eigenlijk twee callbacks zijn die moeten worden uitgevoerd, respectievelijk wanneer de belofte is vervuld en wanneer deze wordt afgewezen, en retourneert een belofte. Vasthoudend aan het bovenstaande voorbeeld, hier is hoe we deze methode zouden kunnen gebruiken om te communiceren met de belofte die wordt geretourneerd wanneer we de readFilePromise functie:

readFilePromise ('. vimrc'). then (function onResolveCallback (data) console.log (data);, function onRejectCallback (reden) console.log ('De foutmelding is $ reason');) 

Wanneer de belofte de in afwachting staat, en dus wordt het opgelost of afgewezen, de dan methode zijn uitgevoerd. Als de belofte wordt opgelost, wordt de eerste callback (in dit geval hebben we de callbacks genoemd om hun rollen gemakkelijker te begrijpen) uitgevoerd, waarbij het argument het resultaat van de asynchrone bewerking bevat (in dit geval de inhoud van de ".vimrc" bestand als een string). Als de belofte wordt afgewezen, wordt in plaats daarvan de tweede callback (we noemden deze onRejectCallback) uitgevoerd: het argument bevat de fout die ervoor zorgde dat de leesbewerking mislukte.

De vangst methode

in tegenstelling tot dan, die zowel handelt wanneer een belofte wordt opgelost als afgewezen, de vangst methode is specifieker en behandelt alleen het laatste geval. Het gebruik van deze methode is het equivalent van gebruiken dan met ongedefinieerd als het eerste argument, in plaats van de callback die wordt gebruikt om de case te behandelen wanneer de belofte is vervuld, en met een geldige callback om de case te behandelen wanneer de belofte wordt afgewezen, als de tweede. Deze methode retourneert een belofte en door deze te gebruiken, kunnen we de bovenstaande code op deze manier herschrijven:

readFilePromise ('. vimrc') // Binnen 'dan' beheren we het geval wanneer de belofte is vervuld, omgaan met // met mogelijke fouten in 'catch'. dan (functie (data) console.log (data);) .catch (functie (reden) console.log ('De foutmelding is $ reden');) 

Kijk hoe we het vangst methode na dan: dit is mogelijk omdat, zoals we hierboven al zeiden, elke methode zelf een belofte teruggeeft, en dus kunnen ze worden geketend.

De Tenslotte methode

Zoals de methoden die we hierboven hebben gezien, Tenslotte geeft een belofte terug. Het wordt altijd uitgevoerd ongeacht de staat van de belofte, zowel als het wordt opgelost of afgewezen. Om deze reden heeft de callback geen argumenten, aangezien er tijdens het uitvoeren geen manier is om te bepalen of de belofte is afgewezen of opgelost. We gebruiken deze methode wanneer we generieke code willen uitvoeren die in elk geval moet worden uitgevoerd.

readFilePromise ('. vimrc') .then (functie (gegevens) console.log (gegevens);) .catch (functie (reden) console.log ('De foutmelding is $ reden');) .finally (function () console.log ("Ik word altijd geëxecuteerd!");) 

In het bovenstaande voorbeeld, of de belofte nu wordt opgelost of afgewezen, de string "Ik word altijd uitgevoerd!" het is gedrukt op de console.

De ras methode

Deze methode heeft een iterabele (bijvoorbeeld een array) als argument. Het retourneert een belofte die is opgelost of afgewezen zodra een belofte in de iterabele staat, de status in behandeling heeft en wordt afgewezen of opgelost. De geretourneerde belofte zal de vervullingswaarde of de afwijzingsreden hebben van die belofte.



const p1 = nieuwe belofte (functie (oplossen, weigeren) setTimeout (oplossen, 100, 'opgelost!');); const p2 = nieuwe belofte (functie (oplossen, weigeren) setTimeout (weigeren, 50, 'afgewezen!');); Promise.race ([p1, p2]) .then (functie (gegevens) console.log (gegevens);) .catch (functie (reden) console.log (reden);) 

In dit voorbeeld hebben we twee nieuwe beloften gecreëerd: de eerste, p1, wordt na 100 milliseconden opgelost; de tweede, p2, wordt na 50 milliseconden afgewezen. We hebben een iterabele doorstaan ​​die beide beloften bevat als het enige argument van de Promise.race methode. Als we de bovenstaande code uitvoeren, krijgen we het volgende resultaat:

afgekeurd!

Wat is er gebeurd? Zoals verwacht is het p2 belofte is de eerste die schikt (het wordt afgewezen), bijgevolg wordt de belofte geretourneerd door de Promise.race methode, verwerpt om dezelfde reden. Zoals u kunt zien, is de staat van de belofte niet relevant: de eerste die daadwerkelijk een andere status krijgt dan in afwachting is degene die ertoe doet.

De alle methode

Leuk vinden ras, de alle methode neemt een iterabele als enige argument. Het geeft een belofte terug die zal oplossen zodra alle beloften in de iterabele zullen worden opgelost (of wanneer de iterabele geen beloften bevat) of zal worden afgewezen met de reden van de eerste belofte in de iterabele die zal worden afgewezen. Bijvoorbeeld:

const p1 = nieuwe belofte (functie (oplossen, weigeren) setTimeout (oplossen, 100, 'p1 opgelost!');) const p2 = nieuwe belofte (functie (oplossen, afwijzen) setTimeout (oplossen, 100, 'p2 opgelost ! ');) Promise.all ([p1, p2]) .then (functie (waarden) console.log (waarden);) 

De bovenstaande code zal terugkeren:

['p1 opgelost!', 'p2 opgelost!' ]

Alle beloften in de iterabele zijn opgelost, dus de in behandeling zijnde belofte geretourneerd door de alle methode ook opgelost, waarvan de waarde een array is met de waarden van alle opgeloste beloften. Als een (en zodra) een van de beloften in de iterabele afwijst, wordt de belofte die door de methode wordt geretourneerd ook afgewezen, met dezelfde reden. Als het iterabele doorgegeven als argument leeg was geweest, zou een reeds opgeloste belofte zijn geretourneerd. Als de iterable geen beloften bevatte, zou de methode een asynchroon opgeloste belofte of een reeds opgeloste belofte hebben geretourneerd, afhankelijk van de omgeving.



De oplossen en verwerpen methoden

Deze twee methoden spreken voor zich.

De oplossen methode accepteert een argument dat de waarde is die moet worden opgelost door de belofte. Het geeft een belofte terug die wordt opgelost met die waarde. De verwerpen methode, op dezelfde manier, neemt een argument aan waarvan de reden met de belofte moet worden afgewezen, en retourneert een belofte die wordt afgewezen met de opgegeven reden. Bijvoorbeeld:

// Resolve a Promise Promise.resolve ('Resolved value'); // Reject a Promise Promise.reject ('Reden om af te wijzen'); 

Conclusies

In deze tutorial hebben we beloftes in Javascript leren kennen en gebruiken. We hebben gezien hoe we onze eigen beloftes kunnen maken, wat de methoden zijn die aan een belofte zijn gekoppeld en hoe we deze kunnen gebruiken om asynchrone code te beheren, als een schoner alternatief voor callbacks. Een geldige bron om uw kennis van beloften verder te vergroten, is die van mozilla. In de volgende Javascript-tutorial zullen we leren hoe u pijl functies. Blijf op de hoogte op linuxconfig.org!



Niemand heeft nog op dit artikel gereageerd.

Een verzameling nuttige informatie over het Linux-besturingssysteem en nieuwe technologieën
Nieuwe artikelen, praktische tips, gedetailleerde recensies en handleidingen. Voel je thuis in de wereld van het Linux-besturingssysteem