Promises Flashcards

1
Q
  1. Wat is het verschil tussen synchronous code en asynchronous code?
A

Synchronous code is code die lijn per lijn wordt uitgevoerd in de volgorde waarin het voorkomt in het programma. Dit kan nadelig zijn voor de performantie van het programma in het geval dat een bepaalde regel code er lang over doet om uitgevoerd te worden.

Asynchronous code is code dat in de achtergrond kan uitgevoerd worden zonder dat de uitvoer van het main programma op hold gezet wordt.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Wat is AJAX en wat kunnen we er mee doen?

A

AJAX staat voor Asynchronous Javascript And XML dat ons toelaat om met servers te communiceren op een asynchrone manier. Onder communicatie verstaan we dan vooral het verzoeken en versturen van data van en naar een server (Denk hierbij aan GET, POST, PATCH, DELETE). AJAX verzoeken gebeuren dynamisch, wat wiit zeggen dat het niet nodig is om de webbrowser te ‘refreshen’ om een verzoek te versturen en af te handelen.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Wat is een server API

A

Wanneer we een request sturen naar de server met AJAX, zal deze request afgehandeld worden door een server API. Deze API zal ons de verzochte data terug sturen.

Een API (Application programming Interface) is een stuk software dat gebruikt wordt om met een ander stuk software te communiceren.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Wat zijn de twee API data formaten?

A

XML en JSON

XML wordt vandaag de dag echter nog raar of zelden gebruikt. In de plaats daarvan wordt het JSON formaat gebruikt om data van en naar servers te versturen. Dit verandert echter niets aan de naam AJAX.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

In javascript zijn er verschillende manieren om een AJAX call te doen. De oudste manier is via de XML HTTP request function. Illustreer Hoe je via deze functie een AJAX call kan uitvoeren?

A

const request = new XMLHttpRequest();

request.open(‘GET’, ‘https://restcountries.com/rest/v2/name/belgium’);

request.send();

request.addEventListener(‘load’, function () {
const data = JSON.parse(this.responseText);
console.log(data);
});

uitleg:
1. Eerst maken we een XML HTTP request aan
2. Dan openen we het request
- eerste parameter: request type
- tweede parameter: de url waarnaar request wordt verstuurd
3. Dan verzenden we het. Eens verzonden wordt het verzoek op de achtergrond afgehandeld.
4. Eens het request is afgehandeld en de nodige data is verkregen, zal de eventhandler worden opgeorepen
- this zal verwijzen naar het huidige request
- responseText bevat het antwoord van de AJAX verzoek. Deze eigenschap zal geïnitialiseerd worden van zodra de verzochte data is aangekomen.
- De data dat we krijgen zal in de vorm van een string zijn. We zetten deze om in een array van objecten met de JSON.parse methode.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Stel dat je twee AJAX calls achter elkaar. Is het dan altijd zo dat de eerste call voor de tweede call is afgehandelt?

A

Neen. Indien je dit echter wel wilt, dan moet je de AJAX calls chainen. Dit can je dan doen door de twee AJAX calls te verzenden in de callback functie van de eerste.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q
  1. Wat is callback hell?
  2. Wat is het nadeel van callback hell?
  3. ES6 heeft een oplossing geïmplementeerd om aan de callback hell te ontsnappen. Wat is de naam van deze oplossing?
A
  1. Callback hell is de naam dat gegeven wordt aan een reeks van geneste callback functies die nodig zijn om een asynchrone taak uit te voeren.
  2. Het nadeeel van callback hell is dat het de code moeilijk leesbaar en begrijpbaar maakt.
  3. Promises
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

De moderne manier om AJAX verzoeken te versturen is door gebruik te maken van de fetch API.

  1. Hoe stuur je een GET request?
  2. Wat voor waarde geeft de fetch API terug?
A
  1. const request = fetch(‘https://restcountries.com/rest/v2/name/belgium’);
  2. Een promise
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q
  1. Wat is een promise?
  2. Welke toestanden kan een promise aannemen?
A
  1. Een promise is een object dat dient als placeholder voor het opslaan van een toekomstige waarde. Deze toekomstige waarde is dan het resultaat van een asynchrone operatie.
  2. Wanneer de toekomstige waarde nog niet bekend is, en dus de asynchrone taak nog in uitvoering is dan bevindt de promise zich in de ‘pending’ toestand.

Wanneer de asynchrone taak is uitgevoerd dan zeggen we dat de promise ‘settled’ is. In dit geval kan een promise zich in één van de volgende toestanden bevinden:
- fulfilled: Toestand dat aangeeft dat de asynchrone taak met succes werd uitgevoerd en daarom ook de gewenste waarde is verkregen.
- rejected: Toestand dat aangeeft dat er iets is fout gelopen bij uitvoer van de asynchrone taak en daarom een ongewenste waarde is verkregen.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q
  1. Wat kan je zeggen over de then methode die gebruikt kan worden op promises?
  2. Wat is de return waarde van een then methode?
  3. Wat kan je zeggen over de returnwaarden van de callback functies die meegegeven worden aan de then methoden?
  4. Worden de callback functies die als parameter van de then methoden worden meegegeven, in dezelfde volgorde uitgevoerd als de volgorde waarin de then methoden aan elkaar zijn geketend?
A
  1. De then methode is een methode dat toepaspbaar is op promises en die gebruikt word om ‘fulfilled’ of ‘rejected’ promises af te handelen.

promise.then(onFulfilled, onRejected);

De then methode neemt twee callback functies als parameters:
- De callback zal worden uitgevoerd in het geval dat de promise ‘fulfilled’ is.
- De tweede promise zal worden uitgevoerd in het geval dat de promlse ‘rejected’ is.

  1. Een nieuwe promise. Dit wilt ook meteen zeggen dat het mogelijk is om verschillende then methoden aan elkaar te ketenen.
  2. De waarde dat de callback functies teruggeven, zal gebruikt worden als de PromiseResult waarde van de promise dat wordt teruggegeven door then.
  3. Neen. Indien dit echter wel nodig is, dan is moet je een promise teruggeven uit te callback functie.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Hoe kan je AJAX Calls in een bepaalde volgorde uitvoeren gebruikmakend van de then methode?

A

Door de AJAX call te doen in de body van één van de callback functies die aan then wordt meegegeven. Het resultaat van die AJAX call is dan een promise. Deze promise hoor je dan terug te geven als waarde van de callback. bijvoorbeeld:

request
.then(function (response) {
// afhandeling van eerste fetch call
return response.json();
})
.then(function (data) {
console.log(data);
// tweede fetch call
return fetch(‘https://anime-facts-rest-api.herokuapp.com/api/v1’);
})
.then(function (response) {
// afhandeling van tweede fetch call
});

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Gegeven:

promise
.then((response) => response.json())
.then((data) => getCountryData(‘portugal’))
.then((response) => console.log(‘success’))
.catch((error) => alert(error));

Waarvoor dient de catch methode?

A

De catch methode zal elke fout opvangen dat zich voordoet op elke plaats in de promise chain (de reeks van geketende then methoden). Wanneer een ‘then’ methode resulteert in een ‘rejected promise, zullen alle then methoden erna genegeerd worden en zal meteen de catch methode worden uitgevoerd. Deze methode neemt een callback functie als parameter dat zal uitgevoerd worden wanneer zich een fout voordoet en daarom de promise zich in de ‘rejected’ toestand bevindt.

De catch methode geeft ook een promise terug.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Waarvoor dient de finally mehtode?

A

Deze methode neemt een callback functie die sowieso zal uitgevoerd worden, wat de toestand van de promise ook is.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

In welk geval zal een promise zich in ‘rejected’ toestand bevinden bij uitvoer van een ajax call?

A

Wanneer de internetverbinding vrebroken wordt terwijl de AJAX call wordt uitgevoerd.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Stel dat je data van een server wilt fetchen. De server API die jouw verzoek afhandelt merkt dat de verzochte data niet bestaat.

  1. Krijg je in dit geval een ‘fulfilled’ of ‘rejected’ promise terug?
A
  1. Je krijgt sowieso een ‘fulfilled’ promise terug. Wel zal de API de status van de response initialiseren met 404 en zal het de ok eigenschap initialiseren met false.

Deze twee eigenschappen kunnen gebruikt worden om na te gaan of de verzochte data wel bestaat of niet. Is dit niet het geval dan moeten we zelf een error aanmaken en ‘throwen’. Dit kan dan als volgt:

promise
.then((response) => {
if (!response.ok) {
throw new Error(requested data not found ${response.status});
}
return response.json();
})
.then((data) => { … })
.then((response) => { … })
.catch((error) => alert(error.message));

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Geef een voobeeld van hoe je een promise kan aanmaken.

A

const somePromise = new Promise(function (resolve, reject) {
if (Math.random() >= 0.5) {
resolve(‘You Win’);
} else {
reject(new Error(‘You Lose’));
}
});

Opmerkingen:
- Om een promise aan te maken gebruiken we de Promise constructor. Deze constructor neemt een functie als parameter die de ‘executor’ wordt genoemd. Van zodra de constructor wordt opgeroepen zal de executor ook worden uitgevoerd.

  • In het algemeen zal de body van de executor asynchrone code bevatten. In dit voorbeeld is dit niet het geval omdat we het simpel willen houden.
  • De executor neem zelf ook twee parameters:
    1. resolve: zal de promise toestand met ‘fulfilled’ initialiseren en zal de PromiseResult initialiseren met de waarde dat als argument van resolve wordt meegegeven.
    2. reject: zal de promise toestand met ‘rejected’ initialiseren en zal de PromiseResult initialiseren met de waarde dat als argument van resolve wordt meegegeven.
  • Het is belangrijk dat de executor de toestand van de aangemaakte promise initialiseert met ‘rejected’ of ‘fulfilled’.
  • Eens aangemaakt kan de promise afgehandeld worden met de then methode.
17
Q

Sinds ES8 is er de mogelijkheid om promises op een elegantere manier af te handelen dan met de then methode. Deze manier maakt gebruik van async/await.

Met async await kunnen we zelf asynchrone functies definiëren, bijvoorbeeld:

async function getAnimeData() {
const response = await fetch(‘someUrl’);
const data = await response.json();
return data;
}

  1. Waarvoor zorgt het async keyword?
  2. Wat geeft de bovenstaande functie terug
  3. Wat is de taak van await?
  4. Welke waarde moet de operand van await teruggeven?
  5. Wat geeft await terug?
  6. Kan await buiten een async functie gebruikt worden?
  7. Zal await de executie van de main code ook stopzetten?
  8. Hoe kunnen we de data bemachtigen dat wordt teruggegeven door de bovenstaande functie?
A
  1. Dat de functie asynchroon (op de achtergrond) wordt uitgevoerd.
  2. Een promise
  3. Await zal volledige code uitvoer stopzetten tot zijn operand een resultaat heeft teruggegeven.
  4. Een promise
  5. De PromiseResult van de promise dat zijn operand heeft teruggegeven.
  6. Enkel in modules (top level await)
  7. Neen. Omdat de await statement zelf behoort tot een asynchrone functie zal deze functie (en dus de await statement) op de achtergrond worden uitgevoerd. Dit is waarom het de main execution niet zal stoppen.
  8. De async functie zal een promise teruggeven. De data dat via de return statement wordt teruggegeven zal opgeslagen zijn als PromiseResult van de promise de async functie teruggeeft. We kunnen deze data dan als volgt bemachtigen:

// we maken een nieuwe async functie en roepen deze meteen op
(async function getData() {
const data = await getAnimeData();
console.log(data);
})();

18
Q
  1. Herschrijf de volgende code aan de hand van async/await:

fetch(‘someUrl’)
.then((response) => {
return response.json();
})
.then((data) => {
console.log(data);
})
.catch((error) => {
alert(error.message);
});

  1. Hoe werkt de try-catch statement?
  2. Vangt het catch blok ook errors op die we zelf aanmaken en ‘throwen’?
A
  1. Je kan dit als volgt herschrijven:

async function foo() {
try {
const response = await fetch(‘someUrl’);
const data = await response.json();
console.log(data);
} catch(error){
alert(error.message);
}
}

  1. De try-catch statement werkt als volgt:
  • De code in het try blok zal uitgevoerd worden zoals gewone code.
  • Van zodra er een error plaatsvindt bij de uitvoer van één van de regels die zich binnen het try blok bevindt, zal de executie van dit blok stoppen en zal het catch blok worden uitgevoerd.
  • Het catch blok heeft toegang tot de error en zal deze error in zijn body afhandelen.
  • Indien er geen error is in het try blok, dan zal het catch blok ook niet worden uitgevoerd.
  1. Ja, ook wanneer we zelf een error maken en ‘throwen’ in het try blok zal de catch blok dit opvangen.
19
Q
  1. Wat doet Promise.all?
  2. Waarvoor gebruik je de Promise.all methode?
A
  1. Neemt een array van promises en zal al deze promises tegelijkertijd uitvoeren. van zodra 1 van de promises in ‘rejected’ resulteert. zal de promise dat Promise.all teruggeeft ook ‘rejected’ zijn.
  2. Om AJAX calls (promises) in parallel uit te voeren en af te handelen.
20
Q

Leg uit wat de volgende promise combinators doen:

  1. Promise.race
  2. Promise.allSettled
  3. Promise.any
A
  1. Neemt een array van promises en zal de eerste ‘settled’ (dus ‘rejected’ of ‘fulfilled’) teruggeven.
  2. Neemt een array van promises en zal een array van alle ‘settled’ promises teruggeven. Het lijkt op Promise.all met als verschil dat Promise.all zal stoppen van zodra er 1 promise ‘rejected’ is.
  3. Neemt een array van promises en zal als de eerste ‘fulfilled’ promise teruggeven.