To proto, že save
je ve skutečnosti I/O operace, která je asynchronní. Nyní for
smyčka je ve skutečnosti synchronizace. Přemýšlejte o tom takto:váš modul JS sériově provádí každý řádek, který vidí. Předpokládejme, že tyto řádky jsou uloženy jedna po druhé na zásobníku. Když dojde na save
, uchovává jej stranou v jiném zásobníku (protože jde o I/O operaci, a proto by to zabralo čas) a pokračuje se zbytkem smyčky. Ukázalo se tedy, že engine zkontroluje tento nový zásobník až poté, co dokončí každý řádek na starším. Tedy hodnota proměnné cats
bude poslední položkou v poli. Uloží se tedy pouze poslední hodnota.
K boji s touto tragédií můžete použít několik metod:
- Uzávěry – Přečtěte si více
- Uzavření můžete provést takto:
cats.forEach()
- Uzavření můžete provést takto:
- Promises – Přečtěte si více . Existuje sladká knihovna což řidiči mongo slibuje, že se s ním bude snadněji pracovat.
- Generátory atd. – Přečtěte si více . Zatím není připraveno na hlavní vysílací čas.
Poznámka k #2 - Nejsem přispěvatelem projektu, ale spolupracuji s autorem. Knihovnu používám již více než rok a je rychlá a úžasná!