⊗jsSpPrmPH 173 of 294 menu

Het probleem van promise hell in JavaScript

Je weet al dat promises zijn gemaakt om het probleem van callback hell op te lossen. Echter, met de tijd bleek dat promises ook complexe code kunnen voortbrengen. Dit probleem werd naar analogie promise hell genoemd.

Laten we dit probleem bekijken aan de hand van voorbeelden code. Stel we hebben een functie getSmth, die een parameter ontvangt en een resultaat teruggeeft afhankelijk van deze parameter:

function getSmth(num) { return new Promise((resolve, reject) => { setTimeout(() => resolve(num * num), 1000) }); }

In dit geval simuleren we een nuttige operatie (bijvoorbeeld het ophalen van gegevens van een server). Als simulatie geven we simpelweg een getal door als parameter en geven we na een seconde het kwadraat van dat getal terug.

Laten we nu onze functie gebruiken getSmth binnen een andere functie:

function func() { getSmth(2).then(res => { console.log(res); // geeft 4 weer }); } func();

Eerste probleem

Veel opeenvolgende constructies then bemoeilijken het begrijpen van de code:

function func(){ getSmth(2).then(res1 => { // doen we iets }).then(res2 => { // doen we iets }).then(res3 => { // doen we iets }).then(res4 => { // doen we iets }).then(res5 => { // doen we iets }).then(res6 => { // doen we iets }); } func();

Tweede probleem

Er is ook een probleem van een andere aard. Stel dat we nu onze functie twee keer willen gebruiken, en vervolgens de resultaten optellen. Als resultaat krijgen we deze code:

function func() { getSmth(2).then(res1 => { getSmth(3).then(res2 => { console.log(res1 + res2); // geeft 13 weer }); }); } func();

Doet al denken aan callback hell, nietwaar? Laten we nog één functieaanroep toevoegen - de code wordt nog erger:

function func() { getSmth(2).then(res1 => { getSmth(3).then(res2 => { getSmth(4).then(res3 => { console.log(res1 + res2 + res3); }); }); }); } func();

We kunnen natuurlijk gebruikmaken van Promise.all:

function func() { Promise.all([getSmth(2), getSmth(3), getSmth(4)]).then(res => { console.log(res[0] + res[1] + res[2]); }); } func();

Maar, hebben we hetzelfde gekregen? Nee! In het eerste geval wacht elke nieuwe functie op de voltooiing van de vorige promise, terwijl in het tweede geval - alle promises gelijktijdig worden uitgevoerd. Dit verschil zal essentieel zijn in het geval wanneer we in de volgende functie de aanroep van de vorige wil doorgeven:

function func() { getSmth(2).then(res1 => { getSmth(res1).then(res2 => { getSmth(res2).then(res3 => { console.log(res3); }); }); }); } func();
Nederlands
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Wij gebruiken cookies voor de werking van de site, analyse en personalisatie. De verwerking van gegevens gebeurt volgens het Privacybeleid.
alles accepteren aanpassen weigeren