Sagen wir, wir haben ein Modell "Benutzer" und ein Modell "Spiel".Nodejs - Was ist die Reihenfolge der Ausführung in diesem Code? Async warten innen für Schleife
Ein Benutzer kann viele Spiele haben, aber ein Spiel gehört nur einem Benutzer.
In "user" Modell, haben wir Feld "gamesCount" - die insgesamt Spiel, dass Benutzer
In "Spiele" -Modell hat, haben wir Feld userId - im Zusammenhang mit Benutzern
Jetzt müssen wir Schleife durch alle Benutzer, und für jeden Benutzer fragen wir die "Spiel" Sammlung, um zu erhalten, wie viele Spiele dieser Benutzer hat, dann speichern Sie den Wert "gamesCount" zum Benutzermodell.
Ich habe 2 Code-Schnipsel:
updateUserGamesCount: async function (req, res) {
try {
let users = await User.find({});
for (let user of users) {
user.gamesCount= await Game.count({userId: user._id});
await user.save();
}
return res.status(200).send("Success");
} catch (err) {
res.status(500).send(err);
}
}
Dieses erste Snippet funktioniert nicht. Es lädt nur für eine Weile und fordert dann eine Auszeit an. Wenn ich den Wert von gamesCount ändern wollte, um zu sehen, ob er aktualisiert wurde oder nicht, wird der Wert nach diesem ersten Snippet-Lauf nicht aktualisiert.
updateUserGamesCount: async function (req, res) {
try {
let users = await User.find({});
for (let user of users) {
user.gamesCount= await Game.count({userId: user._id});
user.save();
}
return res.status(200).send("Success");
} catch (err) {
res.status(500).send(err);
}
}
Dieser zweite Ausschnitt funktioniert. Der einzige Unterschied ist im zweiten Snippet, ich entferne die Wartezeit vor user.save();
Warum passiert das? Ich dachte, dass user.save() asynchron ist und wir müssen warten? Und was genau ist die Reihenfolge der Ausführung in dieser Codezeile?
Vielen Dank.
Was bedeutet "nicht funktioniert"? Gibt 'User.save' ein Versprechen zurück? –
@StephenCleary: Ich habe meine Frage aktualisiert.Es lädt nur für eine Weile und fordert dann eine Auszeit an. Als ich versuchte, den Wert von gamesCount zu ändern, um zu sehen, ob er aktualisiert wurde oder nicht, wird der Wert nach diesem ersten Snippet-Lauf nicht aktualisiert. –