⊗jsSpPrmPH 173 of 294 menu

Die promise hell probleem in JavaScript

Jy weet reeds dat beloftes geskep is om die callback hell probleem op te los. Met verloop van tyd het dit egter geblyk dat beloftes ook ingewikkelde kode kan veroorsaak. Hierdie probleem is by analogie promise hell genoem.

Kom ons kyk na hierdie probleem aan die hand van kodevoorbeelde. Laat ons sê ons het 'n funksie getSmth, wat 'n parameter ontvang en 'n resultaat teruggee afhangende van daardie parameter:

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

In hierdie geval boots ons 'n nuttige handeling na (byvoorbeeld, om data van 'n bediener te kry). As nabootsing gee ons eenvoudig 'n nommer as parameter deur en gee die kwadraat van daardie getal na 'n sekonde terug.

Kom ons gebruik nou ons funksie getSmth binne 'n ander funksie:

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

Eerste probleem

Talle opeenvolgende then konstruksies maak die kode moeilik om te verstaan:

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

Tweede probleem

Daar is ook 'n ander soort probleem. Kom ons sê nou ons wil ons funksie twee keer gebruik, dan die resultate optel. As gevolg daarvan sal ons die volgende kode hê:

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

Dit begin al na callback hell lyk, is dit nie? Kom ons voeg nog een funksie-aanroep by - die kode sal selfs erger word:

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

Ons kan natuurlik Promise.all gebruik:

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

Het ons egter dieselfde resultaat gekry? Nee! In die eerste geval wag elke nuwe funksie vir die voltooiing van die vorige belofte, terwyl in die tweede geval - al die beloftes gelyktydig uitgevoer word. Hierdie verskil sal aansienlik wees in die geval wanneer ons die resultaat van die vorige een wil deurgee aan die volgende funksie:

function func() { getSmth(2).then(res1 => { getSmth(res1).then(res2 => { getSmth(res2).then(res3 => { console.log(res3); }); }); }); } func();
Afrikaans
AzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Ons gebruik koekies vir die werking van die webwerf, ontleding en personalisering. Die verwerking van data geskied volgens die Privaatheidsbeleid.
aanvaar alles instel verwerp