3 votes

Écriture sur la console après une boucle asynchrone

J'essaie de faire une boucle asynchrone, où je fais quelque chose et après la fin, j'écris dans la console. C'est comme ça :

const http = require('http');

async function load(link)
{
    try{
        http.get(link, response => console.log(`File: ${link}`));
    }catch(e){
        console.log('error');
    }
}

async function loop(arrayOfLinks)
{
    for(let link of arrayOfLinks)
        load(link);
}

module.exports = (arrayOfLinks) => {
    (async () => {
        await loop(arrayOfLinks);
        console.log('Files: '+arrayOfLinks.length);
    })();
}

Mais, ce que j'ai :

Fichiers : 3
Dossier : http://localhost:8000/1.jpg
Dossier : http://localhost:8000/2.jpg
Dossier : http://localhost:8000/3.jpg

Et ce que je veux :

Dossier : http://localhost:8000/1.jpg
Dossier : http://localhost:8000/2.jpg
Dossier : http:/
Fichiers : 3

Questions :

  1. Pourquoi await l'opérateur ne bloque pas l'étape suivante ?
  2. Comment puis-je résoudre ce problème ?

Gracias

2voto

dfsq Points 41491

Vous devez vous assurer load renvoie la fonction Promise. http.get par lui-même ne le renverra pas, il faut donc l'envelopper (ou utiliser une bibliothèque HTTP basée sur les promesses, comme la bibliothèque fetch etc).

Une enveloppe de promesse simple pourrait ressembler à ceci :

async function load(link) {
  try {
    return new Promise((resolve, reject) => {
      http.get(link, resolve).on('error', reject)
    })
    .then(response => console.log(`File: ${link}`))
  } catch (e) {
    console.log('error', e.message);
  }
}

async function loop(arrayOfLinks) {
  for (let link of arrayOfLinks)
    await load(link);
}

Vous devez également utiliser await load(link) en loop .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X