Isso porque o
save
é na verdade uma operação de E/S que é assíncrona. Agora, o for
loop é na verdade sync. Pense desta forma:seu mecanismo JS executa serialmente cada linha que vê. Suponha que essas linhas sejam mantidas uma após a outra em uma pilha. Quando se trata de save
, ele o mantém de lado em uma pilha diferente (já que é uma operação de E/S e, portanto, levaria tempo) e segue em frente com o restante do loop. Acontece que o mecanismo só verificaria essa nova pilha depois de concluir todas as linhas da antiga. Portanto, o valor da variável cats
será o último item do array. Assim, apenas o último valor é salvo. Para combater esta tragédia, você pode usar vários métodos:
- Fechamentos - Leia mais
- Você pode fazer o encerramento assim:
cats.forEach()
- Você pode fazer o encerramento assim:
- Promessas - Leia mais . Existe uma sweet library que promete o driver mongo para facilitar o trabalho.
- Geradores etc. - Leia mais . Ainda não está pronto para o horário nobre.
Observação sobre o nº 2 - não sou um contribuidor do projeto, mas trabalho com o autor. Estou usando a biblioteca há mais de um ano e é rápido e incrível!