Ich versuche, die Daten in meiner Datenbank als "Klassen" in serverseitigem JavaScript (Node) zu modellieren. Für den Moment verwende ich einfach das traditionelle Konstruktormuster mit Prototypmethoden, wo angemessen und die Konstruktorfunktion als das gesamte module.exports
auszusetzen. Die Tatsache, dass dies Server-Seite ist, ist für den Kern der Frage unwichtig, aber ich dachte, ich würde es als Referenz zur Verfügung stellen.Modifizieren von Instanzvariablen aus innerer Funktion in einer Prototyp-Methode
Der Problembereich der Code sieht wie folgt aus:
User.prototype.populate = function() {
var that = this;
db.collection("Users").findOne({email : that.email}, function(err, doc){
if(!err) {
that.firstName = doc.firstName;
that.lastName = doc.lastName;
that.password = doc.password;
}
console.log(that); //expected result
});
console.log(that); //maintains initial values
};
Jedes Mal, wenn ich diese Funktion aufrufen, Änderungen an dem Objekt nicht bestehen bleiben, wenn die findOne()
abgeschlossen hat. Ich stelle fest, dass der Geltungsbereich von this
ändert sich auf das globale Objekt mit neuen Funktionsbereichen, so dass ich seine Referenz als that
beibehalten. Wenn console.log(that)
von der anonymen Funktion aus, werden die Daten wie erwartet in den Eigenschaften angezeigt. Wenn ich jedoch that
protokolliere, sobald die Funktion beendet ist, behält sie den Zustand bei, den sie zu Beginn der Funktion hatte.
Was passiert hier und wie kann ich Instanzvariablen wie erwartet ändern?
Das ist richtig. Dies geschieht jedoch sowohl bei einer externen Aufrufprotokollierung user.populate() als auch innerhalb der populate() -Methode selbst (jedoch außerhalb des Geltungsbereichs von findOne()). Ich habe den Beitrag aktualisiert, um zu reflektieren, was ich meinte. – DuxPrime
@ user574930: Aktualisieren Sie Ihren Browser. Ich habe meine Antwort bereits aktualisiert. –
Mit diesem Wissen, wie würde ich dann in der Lage sein, den Effekt zu erreichen, nach dem ich suche, wo ich einfach die populate() Methode aufrufen kann und weiß, dass die Eigenschaften des Objekts aktualisiert werden? – DuxPrime