Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Probleme mit SendTo

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Probleme mit SendTo

    This topic has been deleted. Only users with topic management privileges can see it.
    • F
      FISO last edited by

      Ich hab den SQL Adapter installiert, mit der Absicht, selber Daten zu schreiben und auch auszulesen. Auf der Info-Seite gibt es ja ein paar Beispiele, wie man das macht (Mit SendTo), aber ich bekomm die Daten nicht aus dieser SendTo Funktion "raus", so dass ich die Daten weiterverarbeiten kann.... Hier mein Beispiel:

      var db = "XXX";
      var table = "XXX";
      
      var test1 = "";
      sendTo('sql.0', 'query', 'SELECT * FROM ' + db + "." + table + ' where datum between "2022-03-01" and "2022-03-28"', function (result) {
          if (result.error) {
              console.error(result.error);
          } else {
              // show result        
              help_func(JSON.stringify(result.result));        
          }
      });
          
      
      async function help_func(db_wert) {              
          test1 = await db_wert;
      }
      
      console.log(test1);
      

      console.log(test1) bleibt leer. Führe ich das in der help_func() aus, dann wird mir das angezeigt! Ich kann die Daten nicht in die Variable test1 schreiben und außerhalb von SendTo darauf zugreifen, das geht nur innerhalb. Wie kann man dieses Problem lösen? Mein Hirn raucht schon und bin mehr gefrustet als begeistert 😉

      Ich hoffe ihr könnt mir Helfen 🙂

      VG

      Steve

      OliverIO 1 Reply Last reply Reply Quote 0
      • OliverIO
        OliverIO @FISO last edited by OliverIO

        @fiso

        1. warum verwendest du hier async und await?
          Die Function, die im sendTo-Aufruf definiert wird, ist ein callback.
          dh wenn diese funktion aufgerufen wird, ist das ergebnis bereits in result enthalten und es muss nicht noch gewartet werden.
          wenn du im sql einen fehler gemacht hast, steht das in result.error drin.
          wenn der sqlbefehl erfolgreich war, stehen die daten in result.result drin.
          daher kannst du Zeile 10 direkt mit folgendem ersetzen
        console.log(JSON.stringify(result.result));
        
        1. db_wert ist eine variable
          async und await können nur vor funktionsbezeichner geschrieben werden.

        Zeile 19. der Befehl ist ausserhabl der beiden Blöcke.
        an dieser Stelle ist test1 immer noch "".

        das ist leider etwas das tückische an javascript, das die abarbeitung nicht wie in einer funktionalen programiersprache, welche linear abgearbeitet wird, vergleichbar ist.
        die reihenfolge der abarbeitung
        1-4 normal
        5; der befehl wird gestartet, aber asynchron üer callback. die zeit bis das zurückkehrt ist nicht vorhersehbar und die restlichen befehle des aktuellen blocks müssen noch zu ende abgearbeitet werden
        15, aber keine ausführung, sondern hier wird die funktion an sich nur deklariert
        19. wie bereits gesagt, wegen zeile 4, ist test1 = ""

        dann wenn der sendTo fertig ist, wird der callback (2.parameter im sendto aufgerufen).
        und dann gehts hier ab zeile 6 weiter.

        noch eine zusatzinfo

        await kann nur vor eine funktionsbezeichner geschrieben werden, der ein sogenanntes promis zurück gibt.
        async kapselt automatisch so eine funktion und gibt ohne zutun des programmierers ein promise zurück
        await wartet dann so lange bis der promise aufgelöst wird.
        aber da muss man sich erst ein wenig reindenken
        https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Promise
        https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Statements/async_function
        https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/await

        F 1 Reply Last reply Reply Quote 0
        • F
          FISO @OliverIO last edited by

          @oliverio

          Hallo Oliver,

          Ursprünglich hatte ich ja kein Await und Async verwendent, sondern:

          var db = "XXX";
          var table = "XXX";
           
          var test1 = "";
          sendTo('sql.0', 'query', 'SELECT * FROM ' + db + "." + table + ' where datum between "2022-03-01" and "2022-03-28"', function (result) {
              if (result.error) {
                  console.error(result.error);
              } else {
                  // show result        
                  help_func(JSON.stringify(result.result));        
              }
          });
              
           
          function help_func(db_wert) {              
              test1 = db_wert;
          }
           
          console.log(test1);
          

          Ich bin da noch unerfahren, aber mir wurde im FB-ioBroker bereich geraten damit mal zu experimentieren. Es war mir klar, dass ich wohl damit keinen Erfolg habe.

          Die SQL Syntax ist richtig, ich bekomme ja meine Daten aus der DB zurück. Das einzige was mir halt noch fehlt ist dass ich außerhalb der Blöcke dann damit arbeiten kann.

          So wie ich dich richtig verstanden habe ist, dass der SendTo asynchron gestartet wird und der restliche Code trotzdem weiterverarbeitet wird auch wenn der SendTo Block noch nicht fertig ist. Gibt es denn eine Möglichkeit außerhalb der Blöcke auf das Ergebnis zu warten und erst wenn ich die Daten bekomme dann damit zu arbeiten?

          Ich sage aber schonmal Vorab Danke für deine Erklärung 🙂 Vielen Dank und dir noch einen schönen Abend 🙂

          VG Steve

          OliverIO 1 Reply Last reply Reply Quote 0
          • OliverIO
            OliverIO @FISO last edited by

            Hast du das den mal ausprobiert mit Zeile 10 was ich geschrieben habe?
            Was willst du den mit den Daten machen?
            Das JSON.stringify ist für die Weiterbearbeitung erst mal nicht hilfreich.
            Erst wenn du ein javascript-Objekt in einen Datenpunkt schreiben willst musst du das machen.

            In result.result ist ja ein Array mit Objekten
            Jedes Objekt ein Datensatz aus deiner Datenbank gemäß dem SQL

            Ansonsten machst du einfach so

            var db = "XXX";
            var table = "XXX";
             
            var test1 = "";
            sendTo('sql.0', 'query', 'SELECT * FROM ' + db + "." + table + ' where datum between "2022-03-01" and "2022-03-28"', function (result) {
                if (result.error) {
                    console.error(result.error);
                } else {
                    // show result        
                    help_func(result.result);        
                }
            });
                
             
            function help_func(result) {              
                console.debug(result);
            }
             
            
            1 Reply Last reply Reply Quote 0
            • First post
              Last post

            Support us

            ioBroker
            Community Adapters
            Donate

            571
            Online

            31.9k
            Users

            80.1k
            Topics

            1.3m
            Posts

            2
            4
            347
            Loading More Posts
            • Oldest to Newest
            • Newest to Oldest
            • Most Votes
            Reply
            • Reply as topic
            Log in to reply
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
            The ioBroker Community 2014-2023
            logo