C'est parce que le save
est en fait une opération d'E/S qui est asynchrone. Maintenant, le for
La boucle est en fait synchronisée. Pensez-y de cette façon :votre moteur JS exécute en série chaque ligne qu'il voit. Supposons que ces lignes soient conservées les unes après les autres sur une pile. En ce qui concerne la save
, il le garde de côté sur une pile différente (car il s'agit d'une opération d'E/S, et prendrait donc du temps) et continue avec le reste de la boucle. Il s'avère donc que le moteur ne vérifierait cette nouvelle pile qu'après avoir terminé chaque ligne de l'ancienne. Par conséquent, la valeur de la variable cats
sera le dernier élément du tableau. Ainsi, seule la dernière valeur est enregistrée.
Pour lutter contre cette tragédie, vous pouvez utiliser plusieurs méthodes :
- Fermetures - En savoir plus
- Vous pouvez faire une fermeture comme suit :
cats.forEach()
- Vous pouvez faire une fermeture comme suit :
- Promesses - En savoir plus . Il existe une sweet library qui promet le pilote mongo pour faciliter le travail avec.
- Générateurs, etc. - En savoir plus . Pas encore prêt pour les heures de grande écoute.
Remarque sur #2 - Je ne suis pas un contributeur du projet, mais je travaille avec l'auteur. J'utilise la bibliothèque depuis plus d'un an maintenant, et c'est rapide et génial !