Une façon appropriée d'utiliser des boucles dans Promises

Selon ce lien (Rookie Error # 2), je ne devrais pas utiliser des boucles dans Promises, mais plutôt Promise.all(iterable) .

Est-ce que cela s'applique vraiment à toutes les boucles? Promise.all(iterable) prend un Promise.all(iterable) de taille n. Si j'utilise Promise.all(iterable) , j'obtiendrais en conséquence (c'est-à-dire iterable_A) un tableau de la taille n.

Que faire si je veux itérer à travers iterable et je veux seulement mettre certains éléments qui satisfont mon condition à un autre iterable (par exemple iterable_B) et je veux renvoyer iterable_B au lieu de iterable_A? Devrais-je utiliser Promise.all() aussi?

Je ne devrais pas utiliser des boucles dans Promises

Non, plutôt l'inverse: vous ne devriez pas utiliser les promesses dans les boucles.

Bien sûr, cela est aussi générique. Parfois, vous avez juste besoin d'une structure en boucle. Ce que vous ne devez pas faire, c'est oublier de recueillir les promesses qui sont créées dans le corps de la boucle dans certains iterables que vous pouvez passer à Promise.all , pour attendre toutes les choses asynchrones commencées dans cette boucle.

La méthode de la map comme suggéré dans l'article le fait naturellement, il vous suffit de return une promesse du rappel (comme toujours). En utilisant for / while / .forEach rend un peu plus difficile que vous devez pousser manuellement les promesses dans un tableau (ce qui n'est pas seulement laid mais aussi erroné).

Cependant, si vous ne traitez pas des tâches asynchrones dans votre boucle, vous pouvez faire ce que vous voulez. Par exemple, les deux

 Promise.all(values.filter(syncPredicate).map(asyncFn)) 

et

 Promise.all(promises).then((values) => values.filter(syncPredicate)) 

Sont totalement bien. Il devient un peu plus compliqué lorsque vous avez un prédicat de filtre asynchrone, je recommanderais de rechercher une bibliothèque d'utilité prometteuse dans ce cas.

De plus, vous devrez vous rendre compte que les tâches asynchrones démarrées à partir d'une construction de boucle synchrone seront exécutées en parallèle. Si vous avez l'intention de les exécuter séquentiellement (attendez chaque itération), vous devriez essayer de formuler la boucle en utilisant une structure récursive .