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. Entwicklung
  4. [Frage] Wie ist der richtiger Umgang mit Callbacks?

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    3.2k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.1k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.4k

[Frage] Wie ist der richtiger Umgang mit Callbacks?

Geplant Angeheftet Gesperrt Verschoben Entwicklung
5 Beiträge 4 Kommentatoren 1.0k Aufrufe 6 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.
  • braindeadB Offline
    braindeadB Offline
    braindead
    Developer
    schrieb am zuletzt editiert von
    #1

    Hallo zusammen,

    ich arbeite nach wie vor an meiner ioBroker.homehub Visualisierung. Ich kann die Konfiguration der Instanz einlesen und States anzeigen.

    Jetzt möchte ich noch die Objekte einlesen. Das Ganze soll in folgender Reihenfolge passieren: Erst die Konfiguration der Instanz, dann die Objekte und dann die States. Irgendwie kriege ich das mit den Callbacks aber nicht auf die Reihe.

    Hier mal der Code, den ich momentan habe:

    function initializeHomehub(){
        console.log('Initializing HomeHub');
    
        // Reset everything
        config['initiated'] = false;
        config['categories'] = [];
        config['objects'] = [];
        config['states'] = [];
    
        // Use callbacks to first fetch configuration then objects and then states
        fetchStates(
            fetchObjects(
                fetchConfiguration()
            )
        );
    }
    
    function fetchConfiguration(callback) {
        callback = (typeof callback === 'function') ? callback : function() {};
    
        console.log('Fetching configuration');
    
        servConn.getObject('system.adapter.homehub.0', false, function (error, obj) {
            console.log('Received configuration.');
    
            config['categories'] = obj['native']['categories'];
    
            callback;
        });
    }
    
    function fetchObjects(callback) {
        callback = (typeof callback === 'function') ? callback : function() {};
    
        console.log('Fetching objects');
    
        servConn.getObjects(function (err, _objects) {
            console.log('Received objects.');
    
            config['objects'] = _objects;
    
            callback;
        });
    }
    
    function fetchStates(callback) {
        callback = (typeof callback === 'function') ? callback : function() {};
    
        console.log('Fetching states');
    
        servConn.getStates(function (err, _states) {
            console.log('Received states.');
    
            config['states'] = _states;
    
            config.initiated = true;
    
            callback;
        });
    }
    

    Die Funktion initializeHomehub() soll einmal aufgerufen werden und dann die anderen Funktionen aufrufen. Die Ergebnisse sollen jeweils in die Variable config geschrieben werden.

    Die Ergebnisse werden in die config Variable geschrieben, aber in der Reihenfolge Konfiguration, States, Objects.

    Hat jemand einen Tipp für mich?

    Gruß,
    Markus

    1 Antwort Letzte Antwort
    0
    • OliverIOO Offline
      OliverIOO Offline
      OliverIO
      schrieb am zuletzt editiert von OliverIO
      #2

      wenn du den callback aufrufst, müsste das dann nicht

      callback();
      

      heißen, anstatt einfach nur

      callback;
      

      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 Offline
        T Offline
        tim3trick
        schrieb am zuletzt editiert von
        #3

        Zuerst das was @OliverW sagt, wenn der callback ausgeführt werden soll, musst du das auch mit

        callback(); //Klammern!
        

        machen.

        Dann darfst du im Teil

            fetchStates(
                fetchObjects(
                    fetchConfiguration()
                )
            );
        

        Nicht die "aufgerufenen Funktionen" d.h. ihre Ergebnisse übergeben, sondern lediglich die Referenz auf die Funktion:

        // rufe die fetchObjects Funktion auf und übergebe ihr die Funktion fetchConfiguration als Callback
          fetchObjects(
            fetchConfiguration
          )
        

        Deine Dreier-Kette würde dann so aussehen:

            fetchStates(fetchObjects.bind(null, fetchConfiguration));
        

        Hier wird zuerst eine "virtuelle Methode" erstellt, die das gleiche tut wie fetchObjects, mit dem scope=null und dem vorausgefüllten Parameter callback = fetchConfiguration (das ist fachlich falsch, aber als Erklärung in Ordnung, denke ich).
        Diese "virtuelle Methode" wird als Callback der fetchStates Funktion übergeben.
        Jetzt wird zuerst fetchStates ausgeführt, (wenn du den oben genannten Fix gemacht hast) die auf fetchObjects "virtuelle Methode" und dann im Anschluss fetchConfiguration.

        Nichtsdestotrotz rate ich dir aber, entweder mit Promises oder direkt async / await zu arbeiten, die machen dir das Leben viel leichter.
        Änderst du deine Methoden wie folgt ab:

        function fetchConfiguration(callback) {
            console.log('Fetching configuration');
            return new Promise((resolve, reject) => {
              servConn.getObject('system.adapter.homehub.0', false, function (error, obj) {
                  if (error) {
                    return reject(error);
                  }
                  console.log('Received configuration.');
                  config['categories'] = obj['native']['categories'];
                  resolve();
              });
            });
        }
        function fetchObjects(callback) {
            return new Promise((resolve, reject) => {
              console.log('Fetching objects');
              servConn.getObjects(function (err, _objects) {
                	if (err) {
                    return reject(err);
                  }
                  console.log('Received objects.');
                  config['objects'] = _objects;
                  resolve();
              });
            });
        }
        function fetchStates(callback) {
            return new Promise((resolve, reject) => {
              console.log('Fetching states');
              servConn.getStates(function (err, _states) {
                  if (err) {
                    return reject(err);
                  }
                  console.log('Received states.');
                  config['states'] = _states;
                  config.initiated = true;
                  resolve();
              });
            });
        }
        

        kannst du sie so zusammen setzen:

        fetchStates()
          .then(fetchObjects)
          .then(fetchConfiguration)
          .then(() => { console.log("Done") }) //or something useful
          .catch(console.error) //or something useful
        

        bzw.

        //für await ist noch etwas vorarbeit erforderlich, aber die spare ich hier und heute aus
        await fetchStates();
        await fetchObjects();
        await fetchConfiguration();
        

        was alles viel viel lesbarer ist (und dir die Callback Hell erspart)

        AlCalzoneA 1 Antwort Letzte Antwort
        0
        • T tim3trick

          Zuerst das was @OliverW sagt, wenn der callback ausgeführt werden soll, musst du das auch mit

          callback(); //Klammern!
          

          machen.

          Dann darfst du im Teil

              fetchStates(
                  fetchObjects(
                      fetchConfiguration()
                  )
              );
          

          Nicht die "aufgerufenen Funktionen" d.h. ihre Ergebnisse übergeben, sondern lediglich die Referenz auf die Funktion:

          // rufe die fetchObjects Funktion auf und übergebe ihr die Funktion fetchConfiguration als Callback
            fetchObjects(
              fetchConfiguration
            )
          

          Deine Dreier-Kette würde dann so aussehen:

              fetchStates(fetchObjects.bind(null, fetchConfiguration));
          

          Hier wird zuerst eine "virtuelle Methode" erstellt, die das gleiche tut wie fetchObjects, mit dem scope=null und dem vorausgefüllten Parameter callback = fetchConfiguration (das ist fachlich falsch, aber als Erklärung in Ordnung, denke ich).
          Diese "virtuelle Methode" wird als Callback der fetchStates Funktion übergeben.
          Jetzt wird zuerst fetchStates ausgeführt, (wenn du den oben genannten Fix gemacht hast) die auf fetchObjects "virtuelle Methode" und dann im Anschluss fetchConfiguration.

          Nichtsdestotrotz rate ich dir aber, entweder mit Promises oder direkt async / await zu arbeiten, die machen dir das Leben viel leichter.
          Änderst du deine Methoden wie folgt ab:

          function fetchConfiguration(callback) {
              console.log('Fetching configuration');
              return new Promise((resolve, reject) => {
                servConn.getObject('system.adapter.homehub.0', false, function (error, obj) {
                    if (error) {
                      return reject(error);
                    }
                    console.log('Received configuration.');
                    config['categories'] = obj['native']['categories'];
                    resolve();
                });
              });
          }
          function fetchObjects(callback) {
              return new Promise((resolve, reject) => {
                console.log('Fetching objects');
                servConn.getObjects(function (err, _objects) {
                  	if (err) {
                      return reject(err);
                    }
                    console.log('Received objects.');
                    config['objects'] = _objects;
                    resolve();
                });
              });
          }
          function fetchStates(callback) {
              return new Promise((resolve, reject) => {
                console.log('Fetching states');
                servConn.getStates(function (err, _states) {
                    if (err) {
                      return reject(err);
                    }
                    console.log('Received states.');
                    config['states'] = _states;
                    config.initiated = true;
                    resolve();
                });
              });
          }
          

          kannst du sie so zusammen setzen:

          fetchStates()
            .then(fetchObjects)
            .then(fetchConfiguration)
            .then(() => { console.log("Done") }) //or something useful
            .catch(console.error) //or something useful
          

          bzw.

          //für await ist noch etwas vorarbeit erforderlich, aber die spare ich hier und heute aus
          await fetchStates();
          await fetchObjects();
          await fetchConfiguration();
          

          was alles viel viel lesbarer ist (und dir die Callback Hell erspart)

          AlCalzoneA Offline
          AlCalzoneA Offline
          AlCalzone
          Developer
          schrieb am zuletzt editiert von
          #4

          @tim3trick sagte in [Frage] Wie ist der richtiger Umgang mit Callbacks?:

          fetchStates(fetchObjects.bind(null, fetchConfiguration));

          Hier wird zuerst eine "virtuelle Methode" erstellt, die das gleiche tut wie fetchObjects, mit dem scope=null und dem vorausgefüllten Parameter callback = fetchConfiguration (das ist fachlich falsch, aber als Erklärung in Ordnung, denke ich).

          Das funktioniert zwar, lesbarer und verständlicher ist IMO aber folgende Variante:

          fetchStates(
              () => fetchObjects(
                  () => fetchConfiguration()
              )
          );
          

          Die ist außerdem näher dran an dem, was @braindead zuerst hatte (nur dass er die Funktionen direkt aufgerufen hat, statt Callbacks zu definieren.

          Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

          1 Antwort Letzte Antwort
          0
          • braindeadB Offline
            braindeadB Offline
            braindead
            Developer
            schrieb am zuletzt editiert von
            #5

            Vielen Dank für Eure Hilfe. Kaum mache ich es richtig, funktioniert es genauso, wie es sein soll. :-)

            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

            577

            Online

            32.7k

            Benutzer

            82.3k

            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