Това е така, защото save
всъщност е I/O операция, която е Async. Сега, for
цикъл всъщност е синхронизиране. Мислете за това по следния начин:вашият JS двигател последователно изпълнява всеки ред, който вижда. Да приемем, че тези редове се съхраняват един след друг в стек. Когато става въпрос за save
, той го държи настрана на различен стек (тъй като това е I/O операция и следователно ще отнеме време) и продължава с останалата част от цикъла. Оказва се, че двигателят ще провери този нов стек само след като е завършил всеки ред на по-стария. Следователно стойността на променливата cats
ще бъде последният елемент в масива. Така се записва само последната стойност.
За да се преборите с тази трагедия, можете да използвате няколко метода:
- Затваряния - Прочетете повече
- Можете да направите затваряне така:
cats.forEach()
- Можете да направите затваряне така:
- Обещания - Прочетете повече . Има сладка библиотека което обещава драйверът mongo да улесни работата с него.
- Генератори и др. - Прочетете повече . Все още не е готов за праймтайма.
Забележка относно #2 - Аз не съм сътрудник на проекта, но работя с автора. Използвам библиотеката вече повече от година и е бърза и страхотна!