NEWS
Problem mit 2 Klassen und Callback
-
Hallo,
ich habe ein Problem mit Klassen und Callback-Funktionen.
Aus Klasse Test1 wird ein Objekt erzeugt und erzeugt seinerseits ein Objekt aus Klasse Test2 und übergibt ihm eine Callbackfunktion.
Ruft das Objekt Test2 nun die Callbackfunktion auf ist ein Zugriff auf die Variablen und Funktionen des Objektes Test1 nicht mehr möglich.
Aus den Klassen sollen später mehrere Objekte mit verschiedenen Eigenschaften erzeugt werden.Was kann man tun? Javascript unterstützt scheinbar keine "nested Klassen", also die Klasse Test2 innerhalb der Klasse Test1 anlegen.
Beispiel:
let index = 0; schedule("*/5 * * * * *", async () => { log("Dauer: " + index * 5 + " sek"); test1.run(); index++; }); class Test1{ text = "Wichtig!"; constructor(){ this.timer = new Test2(this.callback); this.timer.start(30); } callback(){ log("Ergebnis: " + this.text); // this.timer.start(10); } run(){ this.timer.run(); } } class Test2{ constructor(callback){ this.callback = callback; } start(dauer){ this.dauer = dauer; this.time = Date.now(); } run(){ if(this.time > -1){ if(Date.now() - this.time > this.dauer * 1000){ this.callback(); this.time = -1; } } } } let test1 = new Test1();Grüße Martin
-
Dann übergebe mit der Funktion noch eine Referenz auf das Objekt
Test1
constructor(){ this.timer = new Test2(this.callback, this);Test2
class Test2{ constructor(callback, obj){ this.callback = callback; this.obj = obj; } run(){ if(this.time > -1){ if(Date.now() - this.time > this.dauer * 1000){ this.callback(); this.time = -1; } } } } -
Und das obj dann wieder mit dem Callback zurück?
// in Test1 callback(obj){ log("Ergebnis: " + obj.text); obj.timer.start(10); } // in Test2 this.callback(this.obj);Erscheint mir wie "Von hinten durch die Brust ins Auge".
Im Beispielprogramm funktioniert es, mal sehen ob es im "Großen" auch so geht. -
callback = () => { log("Ergebnis: " + this.text); // this.timer.start(10); } -
Könnte funktionieren.
Sicher bin ich mir aber nicht da ja eigentlich immer der Kontext (this) der aufrufenden Funktion mitkommt. Bspw wie beim callback von onTimeoutAlternativ noch mit apply oder bind. Das finde ich genauso schrecklich.
-
@ticaki
Klasse, das geht. Sieht man ja sogar öfter wenn Funktionen übergeben werden.