Inleiding
Javascript Promises kunnen lastig te begrijpen zijn. Daarom wil ik de manier opschrijven waarop ik promises begrijp.
Promises Begrijpen
Een Promise in het kort:
“Stel je bent een kind. Je moeder belooft je dat ze je volgende week een nieuw telefoon zal kopen.”
Je weet niet of je die telefoon krijgt tot volgende week. Je moeder kan echt je een nieuwe telefoon kopen, of dat doet ze niet.
Dat is een belofte. Een belofte heeft drie staten. Ze zijn:
- Pending: Je weet niet of je die telefoon krijgt
- Fulfilled: Moeder is blij, ze koopt je een nieuwe telefoon
- Rejected: Moeder is onblij, ze koopt je geen telefoon
Een Promise Maken
Laten we dit omzetten naar JavaScript.
De code is zelf al vrij expressief.
Hieronder ziet een promise-syntax er normaal gesproken uit:
Consumeren van Promises
Nu we de promise hebben, laten we het consumeren:
Laten we het voorbeeld uitvoeren en het resultaat bekijken!
Demo: https://jsbin.com/nifocu/1/edit?js,console
Keten van Promises
Promises zijn ketensbaar.
Stel je voor, jij, het kind, beloofd je vriend dat je hun laat zien het nieuwe telefoon wanneer je moeder je er een koopt.
Dat is een andere belofte. Laten we het opschrijven!
Opmerking: We kunnen de bovenstaande code korter schrijven door het als volgt te doen:
Laten we de promises ketenen. Jij, het kind, kunt pas de showOff
belofte starten na de willIGetNewPhone
belofte.
Zo kun je de belofte ketenen.
Beloften zijn Asynchroon
Beloften zijn asynchroon. Laten we een bericht loggen voor en na het aanroepen van de belofte.
Wat is de verwachte uitvoerreeks? Je zou verwachten:
1. before asking Mom
2. Hey friend, I have a new black Samsung phone.
3. after asking mom
Echter, de werkelijke uitvoerreeks is:
1. before asking Mom
2. after asking mom
3. Hey friend, I have a new black Samsung phone.
Je zou niet stoppen met spelen terwijl je wacht op de belofte van je moeder (de nieuwe telefoon). Dat noemen we asynchroon: de code zal uitvoeren zonder te blokkeren of te wachten op het resultaat. Alles wat moet wachten op een belofte om verder te gaan, wordt in .then
geplaatst.
Hier is het volledige voorbeeld in ES5:
Promessen in ES5, ES6/2015, ES7/Next
ES5 – Meerderheid browsers
Hetdemo-code werkt in ES5-omgevingen (alle grote browsers + NodeJs) als u Bluebirdpromessenbibliotheek toevoegt. Dit omdat ES5 geen ondersteuning voorpromessen uit de box biedt. Een andere beroemdepromessenbibliotheek is Q door Kris Kowal.
ES6 / ES2015 – Moderne browsers, NodeJs v6
De demo code werkt direct uit de doos omdat ES6 promises native ondersteunt. Daarnaast kunnen we met ES6-functies de code verder vereenvoudigen met een pijlfunctie en const
en let
gebruiken.
Hier is het volledige voorbeeld in ES6-code:
Merk op dat alle var
zijn vervangen door const
. Alle function(resolve, reject)
zijn vereenvoudigd tot (resolve, reject) =>
. Er zijn een aantal voordelen die voortkomen uit deze wijzigingen.
ES7 – Async/Await
ES7 introduceerde de async
en await
syntaxis. Het maakt de asynchrone syntaxis gemakkelijker te begrijpen, zonder de .then
en .catch
.
Schrijf ons voorbeeld opnieuw met ES7-syntaxis:
Beloftes en Wanneer Ze Te Gebruiken
Waarom hebben we beloftes nodig? Hoe zag de wereld eruit voordat we beloftes hadden? Voordat we deze vragen beantwoorden, laten we teruggaan naar de basis.
Normale Functie VS Asynchrone Functie
Laten we eens kijken naar deze twee voorbeelden. Beide voorbeelden voeren de optelling van twee getallen uit: één voegt toe met normale functies en de ander voegt extern toe.
Normale Functie om Twee Getallen Toe Te Voegen
Asynchrone Functie om Twee Getallen Toe Te Voegen
Als je de getallen met de normale functie optelt, krijg je het resultaat onmiddellijk. Als je echter een externe oproep doet om het resultaat te krijgen, moet je wachten en kun je het resultaat niet onmiddellijk krijgen.
Je kunt niet weten of je de resultaat zal krijgen omdat de server mogelijk down zijn, langzaam responsief zijn, etc. Je wilt niet dat je hele proces blokkeerd wordt terwijl je wacht op het resultaat.
API’s aanroepen, bestanden downloaden en bestanden lezen zijn onder andere gewoonlijk eenvoudige asynchrone operationele die je uitvoert.
Je hoeft geen promeses te gebruiken voor een asynchrone aanroep. Voor het gebruik van promeses waren callback functies een functie waar je bij het ontvangen van het resultaat aanroept. Laat ons de vorige voorbeeld modificeren om een callback te accepteren.
// Subsequent Async Action
In plaats van de cijfers te voeg aan elkaar in een normale functie, wil je drie keer toevoegen. In een normale functie zou je dit doen:
Zo ziet dit eruit met callbacks:
Demo: https://jsbin.com/barimo/edit?html,js,console
Deze syntaxis is minder gebruiksvriendelijk vanwege de diep geneste callbacks.
Diep geneste callbacks vermijden
Promises kunnen helpen om diep geneste callbacks te vermijden. Laten we eens kijken naar de promise-versie van hetzelfde voorbeeld:
Met promises vegen we de callback af met .then
. Op een manier ziet het er schoner uit omdat er geen callback nesting is. Met ES7 async
syntaxis kun je dit voorbeeld verder verbeteren.
Observables
Voordat je besluit om met promises verder te gaan, is er iets dat is ontstaan om je te helpen met async data, genaamd Observables
.
Laten we naar hetzelfde voorbeeld kijken, geschreven met Observables. In dit voorbeeld zullen we RxJS gebruiken voor de observables.
Observables kunnen meer interessante dingen doen. Bijvoorbeeld, delay
een functie toevoegen door 3 seconden
met slechts één regel code of retry, zodat je een oproep een bepaald aantal keren kunt herhalen.
Je kunt een van mijn RxJs-berichten hier.
Conclusie
Vertrouwd raken met callbacks en promises is belangrijk. Begrijp ze en gebruik ze. Maak je nog geen zorgen over Observables. Alle drie kunnen een rol spelen in je ontwikkeling, afhankelijk van de situatie.
Source:
https://www.digitalocean.com/community/tutorials/understanding-javascript-promises