Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Problem mit 2 Klassen und Callback

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    21
    1
    935

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.0k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.4k

Problem mit 2 Klassen und Callback

Geplant Angeheftet Gesperrt Verschoben JavaScript
6 Beiträge 3 Kommentatoren 149 Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • M Online
    M Online
    Martin 5
    schrieb am zuletzt editiert von
    #1

    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

    OliverIOO 1 Antwort Letzte Antwort
    0
    • M Martin 5

      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

      OliverIOO Offline
      OliverIOO Offline
      OliverIO
      schrieb am zuletzt editiert von OliverIO
      #2

      @martin-5

      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;
                   }
               }
           }
       }
      
      

      Meine Adapter und Widgets
      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
      Links im Profil

      M 1 Antwort Letzte Antwort
      1
      • OliverIOO OliverIO

        @martin-5

        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;
                     }
                 }
             }
         }
        
        
        M Online
        M Online
        Martin 5
        schrieb am zuletzt editiert von Martin 5
        #3

        @oliverio

        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.

        T 1 Antwort Letzte Antwort
        0
        • M Martin 5

          @oliverio

          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.

          T Nicht stören
          T Nicht stören
          ticaki
          schrieb am zuletzt editiert von
          #4

          @martin-5

              callback = () => {
                  log("Ergebnis: " + this.text);
          //        this.timer.start(10);
              }
          

          Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

          Spenden

          M 1 Antwort Letzte Antwort
          1
          • OliverIOO Offline
            OliverIOO Offline
            OliverIO
            schrieb am zuletzt editiert von
            #5

            @ticaki

            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 onTimeout

            Alternativ noch mit apply oder bind. Das finde ich genauso schrecklich.

            Meine Adapter und Widgets
            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
            Links im Profil

            1 Antwort Letzte Antwort
            0
            • T ticaki

              @martin-5

                  callback = () => {
                      log("Ergebnis: " + this.text);
              //        this.timer.start(10);
                  }
              
              M Online
              M Online
              Martin 5
              schrieb am zuletzt editiert von Martin 5
              #6

              @ticaki
              Klasse, das geht. Sieht man ja sogar öfter wenn Funktionen übergeben werden.

              1 Antwort Letzte Antwort
              0
              Antworten
              • In einem neuen Thema antworten
              Anmelden zum Antworten
              • Älteste zuerst
              • Neuste zuerst
              • Meiste Stimmen


              Support us

              ioBroker
              Community Adapters
              Donate

              800

              Online

              32.5k

              Benutzer

              81.6k

              Themen

              1.3m

              Beiträge
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
              ioBroker Community 2014-2025
              logo
              • Anmelden

              • Du hast noch kein Konto? Registrieren

              • Anmelden oder registrieren, um zu suchen
              • Erster Beitrag
                Letzter Beitrag
              0
              • Home
              • Aktuell
              • Tags
              • Ungelesen 0
              • Kategorien
              • Unreplied
              • Beliebt
              • GitHub
              • Docu
              • Hilfe