Est-ce que vous vous êtes déjà demandé s'il y avait une solution facile pour faire des Pool de Promise afin de limiter le nombre d'exécution asynchrone?
Je ne sais pas vous mais il m'arrive parfois de devoir faire beaucoup de fetch asynchrone. Par exemple lorsque je fetch une API qui me retourne une liste de resources et que j'ai besoin de récupérer chacun de ces ressources.
Dans ce cas les solutions simple sont de faire les fetch les uns après les autres. Ça fonctionne mais ça peut être lent.
L'autre solution c'est de faire tout les fetch en parallèle. Si il n'y en a pas trop pas de soucis mais si tu as beaucoup de resources à récupérer tu risques d'attendre la limit de fetch que l'API t'autorise.
La solution optimale serait de faire le fetch en parallèle mais qu'un nombre restreint de fetch à la fois.
Bien sûr tu as des libs pour faire ça comme par exemple es6-promise-pool, mais en cherchant je suis tombé sur une solutions simple qui te permet de te faire ton propre PromisePool.
L'idée c'est qu'un iterator peut être consumé par plusieurs boucle.
Voici les étapes a suivre:
1. Créé un iterator. Si tu as un tableau d'url il te suffit d'appeler la method 𝘷𝘢𝘭𝘶𝘦𝘴.
𝚌𝚘𝚗𝚜𝚝 𝚞𝚛𝚕𝙸𝚝𝚎𝚛𝚊𝚝𝚘𝚛 = 𝚞𝚛𝚕𝚜.𝚟𝚊𝚕𝚞𝚎𝚜();
2. Puis tu créer un tableau de la taille du nombre de fetch que tu veux en parallèle et tu le remplis avec ton iterator.
𝚌𝚘𝚗𝚜𝚝 𝚙𝚘𝚘𝚕𝚜 = 𝙰𝚛𝚛𝚊𝚢(2).𝚏𝚒𝚕𝚕(𝚞𝚛𝚕𝙸𝚝𝚎𝚛𝚊𝚝𝚘𝚛);
3. Pour convertir ton tableau d'iterator en tableau de promise qui consume ton iterator
𝚌𝚘𝚗𝚜𝚝 𝚠𝚘𝚛𝚔𝚎𝚛𝚜 = 𝚙𝚘𝚘𝚕𝚜.𝚖𝚊𝚙(𝚊𝚜𝚢𝚗𝚌 𝚏𝚞𝚗𝚌𝚝𝚒𝚘𝚗 (𝚞𝚛𝚕𝙸𝚝𝚎𝚛𝚊𝚝𝚘𝚛) {
𝚌𝚘𝚗𝚜𝚝 𝚛𝚎𝚜𝚞𝚕𝚝𝚜 = [ ];
𝚏𝚘𝚛 (𝚌𝚘𝚗𝚜𝚝 𝚞𝚛𝚕 𝚘𝚏 𝚞𝚛𝚕𝙸𝚝𝚎𝚛𝚊𝚝𝚘𝚛) {
𝚛𝚎𝚜𝚞𝚕𝚝𝚜.𝚙𝚞𝚜𝚑(𝚊𝚠𝚊𝚒𝚝 𝚏𝚎𝚝𝚌𝚑(𝚞𝚛𝚕));
}
𝚛𝚎𝚝𝚞𝚛𝚗 𝚛𝚎𝚜𝚞𝚕𝚝𝚜;
});
4. Enfin tu as plus qu'a attendre que les pools se résolve.
𝙿𝚛𝚘𝚖𝚒𝚜𝚎.𝚊𝚕𝚕𝚂𝚎𝚝𝚝𝚕𝚎𝚍(𝚠𝚘𝚛𝚔𝚎𝚛𝚜).𝚝𝚑𝚎𝚗(𝚌𝚘𝚗𝚜𝚘𝚕𝚎.𝚕𝚘𝚐.𝚋𝚒𝚗𝚍(𝚗𝚞𝚕𝚕, '𝚍𝚘𝚗𝚎'))
Voila. J'espère que ça t'a été utile et que tu as appris quelque chose.
Je mets en commentaire le lien vers la solution stackoverflow qui j'espère t'apportera un complément d'information.