[NodeJS] Hoe los ik dit op met promises?

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • DennusB
  • Registratie: Mei 2006
  • Niet online
Mijn vraag
Ik probeer een script te maken wat aan de hand van een lijstje ARN's voor mij een setje load-balancers in AWS opvraagt. Nu is dat opvragen van die spullen in AWS async dus ik wil dat netjes afwachten in mijn script.
Ik heb nu dit stukje (snippet):

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
  const promisedata = new Promise((resolve, reject) => {
            global.gConfig.targetgrouparns.map(function(element) {
            awsclient.checkArns(element).then(
                function(result) { tgarns.push = element; logger.debug("Checked ARN " + element + " and it's verified!"); },
                function(error) { logger.error("Checked TG ARN " + element + " and it's not found :(!") }
            )
        })
        resolve(tgarns);
    });

        Promise.all([promisedata]).then(function(values) {
            console.log(values);
        });


global.gConfig.targetgrouparns is een array met arns, ik loop daar dus doorheen met de map functie. De 'awsclient.checkArns' functie is zelf gemaakt en geeft een promise terug en resolved deze als de data van AWS binnen is.
So far so good, maar op de een of andere manier is m'n laatste stukje code altijd uitgevoerd voor de promises klaar zijn en ik weet echt niet hoe ik dit moet oplossen.
Iemand enig idee / een tip om verder te komen?

Owner of DBIT Consultancy | DJ BassBrewer

Beste antwoord (via DennusB op 17-03-2020 09:46)


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het resultaat van map geeft een andere lijst terug, als je dus gewoon naar de juiste promise mapt, kun je daar op wachten.
JavaScript:
1
2
3
4
5
var promises = global.gConfig.targetgrouparns.map(element => awsclient.checkArns(element).then(..));

        Promise.all(promises).then(function(values) {
            console.log(values);
        });

[ Voor 14% gewijzigd door Woy op 17-03-2020 09:43 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Alle reacties


Acties:
  • +1 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Zo te zien geeft awsclient.checkArns(element) gewoon een promise terug ( Je gebruikt immers then op het resultaat ).

In plaats van die in een promise wrappen kun je natuurlijk gewoon die promises in je Promise.all gebruiken.

Je map functie is namelijk niet blocking, en dus direct na het starten van al je aws promises resolve je je eigen gemaakte promise.

[ Voor 22% gewijzigd door Woy op 17-03-2020 09:38 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • DennusB
  • Registratie: Mei 2006
  • Niet online
Woy schreef op dinsdag 17 maart 2020 @ 09:37:
Zo te zien geeft awsclient.checkArns(element) gewoon een promise terug ( Je gebruikt immers then op het resultaat ).

In plaats van die in een promise wrappen kun je natuurlijk gewoon die promises in je Promise.all gebruiken.
Ja die geeft een promise terug, maar hoe wrap ik dat in m'n Promise.all zonder de forEach loop (met map) te verliezen?

Owner of DBIT Consultancy | DJ BassBrewer


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het resultaat van map geeft een andere lijst terug, als je dus gewoon naar de juiste promise mapt, kun je daar op wachten.
JavaScript:
1
2
3
4
5
var promises = global.gConfig.targetgrouparns.map(element => awsclient.checkArns(element).then(..));

        Promise.all(promises).then(function(values) {
            console.log(values);
        });

[ Voor 14% gewijzigd door Woy op 17-03-2020 09:43 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • DennusB
  • Registratie: Mei 2006
  • Niet online
Woy schreef op dinsdag 17 maart 2020 @ 09:42:
Het resultaat van map geeft een andere lijst terug, als je dus gewoon naar de juiste promise mapt, kun je daar op wachten.
JavaScript:
1
2
3
4
5
var promises = global.gConfig.targetgrouparns.map(element => awsclient.checkArns(element).then(..));

        Promise.all(promises).then(function(values) {
            console.log(values);
        });
Bijzonder hoe simpel de oplossing soms is. Dankjewel, dit lijkt goed te werken!

Owner of DBIT Consultancy | DJ BassBrewer