Hallo Christoph,
Zitat
Wie bekomme ich die User in den Kontext der aufrufenden Klasse?
Kurze Antwort: Niemals!
Erklärung:
was du hier erlebst, ist die größte Herausforderung bei der Asynchronen Programmierung: Die Asynchronität.
Wenn man sich die Reihenfolge anschaut, in der die Funktionen aufgerufen werden, sieht man auch warum:
/*
* Ich habe den Quellcode ein wenig umgestellt, um die Asynchronität zu verdeutlichen.
*
* Wenn du den Code in node oder im Browser ausführst kannst du an der nummerierten Ausgabe verfolgen,
* in welcher Reihenfolge die Einzelnen Funktionen ausgeführt werden
*
* Wenn dir Das Ganze zu unübersichtlich ist, kannst du auch entweder die console.log-Aufrufe
* oder die Kommentare Löschen oder beides.
*/
// Dies hier ist eine Hilfsfunktion, die das lesen vom Filesystem verdeutlichen soll.
const getUsersPromise = async () => {
return JSON.stringify([{ name: "Max" }, { name: "Moritz" }]);
};
// START DES BEISPIELS
// I) Zuerst wird die Variable '_users' Definiert und mit einem leeren Array initialisiert.
var _users = [];
console.log("01. _users wird definiert.\t\t\t\t", _users);
// II) Danach wird die Funktion LoadUsers aufgerufen und ihr der Callback 'onLoadUsers' übergeben.
LoadUsers(onLoadUsers);
function LoadUsers(callback) {
console.log("02. LoadUsers wird aufgerufen.");
// III) In der Funktion 'LoadUsers' werden die Daten Asynchron geladen.
console.log("03. Das abrufen der Daten wird gestartet.");
var usersRaw = getUsersPromise();
usersRaw.then(function (value) {
// VIII) Wenn die Daten gelesen werden sie bearbeitet
console.log("07. Die Daten sind fertig eingelesen:\t\t\t\t\t", value);
var users = JSON.parse(value);
console.log(
"08. onLoadUsers wird as Callback aufgerufen 'users' wird übergeben:\t",
users
);
// IX) und der vorher übergebene Callback wird aufgerufen.
callback(users);
});
// IV) Dann wird die Funktion beendet, ohne, dass die Daten schon da sind.
console.log("04. LoadUsers ist beendet.");
}
// V) Dann wird die Variable '_users' ausgegeben
// (Sie enthält erwartungsgemäß, das leere Array.)
console.log("05. Die Variable _users wird ausgegeben.\t\t\t\t", _users);
// VI) Dahinter wird der ganze synchrone Code ausgeführt, der noch da ist ...
// VII) ENDE der Codeausführung.
console.log("06. ENDE der synchronen Codeausführung\n---------");
// Erst wenn die Daten da sind, ruft die Funktion 'LoadUsers' die Funktion 'onLoadUsers' mit den Userdaten auf.
function onLoadUsers(users) {
// X) Beim Aufruf wird der Funktion die gelesenen und verarbeiteten Daten übrgeben.
console.log("09. onLoadUsers wurde aufgerufen.");
// XI) Die Daten können wir uns dann ausgeben lassen.
console.log("10. Daten werde ausgegeben:\t\t\t\t\t\t", users); //User
// XII) zumschluss werden die gelesenen Daten der Variablen '_users' zugewiesen.
_users = users;
}
Alles anzeigen
Zusammengefasst, existieren die Daten nur im Scope (Kontexts) des onLoadUsers Callbacks.
Wenn du also mit den Daten weiterarbeiten möchtest, musst du das in diesem Scope tun.
Ich hoffe ich konnte ein wenig Klarheit in dieses Thema bringen, es ist mit das schwerste, was in der Programmierung existiert.
Grüße
Andreas