Det beror på att save
är faktiskt en I/O-operation som är Async. Nu, for
loop är faktiskt sync.Tänk på det så här:din JS-motor kör seriellt varje rad den ser. Antag att dessa rader hålls en efter en på en stack. När det gäller save
, den håller den åt sidan på en annan stack (eftersom det är en I/O-operation och därför skulle ta tid) och går vidare med resten av slingan. Det visar sig så att motorn bara skulle kontrollera denna nya stack efter att den har slutfört varje rad på den äldre. Därför är värdet på variabeln cats
kommer att vara det sista objektet i arrayen. Därmed sparas endast det sista värdet.
För att bekämpa denna tragedi kan du använda flera metoder:
- Stängningar - Läs mer
- Du kan stänga så här:
cats.forEach()
- Du kan stänga så här:
- Löfter - Läs mer . Det finns ett sweet bibliotek som lovar mongoföraren att göra det lättare att arbeta med.
- Generatorer, etc. - Läs mer . Inte redo för sändningstid än.
Anmärkning om #2 - Jag är inte en bidragsgivare till projektet, men samarbeta med författaren. Jag har använt biblioteket i över ett år nu, och det är snabbt och fantastiskt!