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:

javascriptfunction 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:

javascriptfunction 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:

javascriptfunction 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ê:

javascriptfunction 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:

javascriptfunction 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:

javascriptfunction 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:

javascriptfunction func() {
  getSmth(2).then(res1 => {
    getSmth(res1).then(res2 => {
      getSmth(res2).then(res3 => {
        console.log(res3);
      });
    });
  });
}

func();