Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Test SQL-Abfrage

    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

    Test SQL-Abfrage

    This topic has been deleted. Only users with topic management privileges can see it.
    • T
      ticaki Developer @ROGA last edited by ticaki

      @roga

      Ich baue alle aufwendigeren Skript so auf

      const bla
      const mehrbla
      var blabla
      var mehrblabla
      
      async function main() {
      // code
      } 
      
      // letzte Zeile im Skript
      main()
      

      EDIT: Der main() Aufruf am ende ist wichtig, kanns zwar nicht das wieso erklären, aber wenn das Skript nicht ganz eingelesen ist, kommt es vor, das Funktionen und Variablen die später als der Aufruf definiert werden, Fehler erzeugen.

      haus-automatisierung paul53 2 Replies Last reply Reply Quote 0
      • haus-automatisierung
        haus-automatisierung Developer Most Active @ROGA last edited by

        @roga sagte in Test SQL-Abfrage:

        Frage: Was macht oder bewirkt dieser Pfeil "=>"?

        Das ist eine arrow function. Eine etwas andere Definition einer anonymen Funktion, welche sich etwas anders verhält als mit dem Schlüsselwort function. Macht in diesem Beispiel aber keinen Unterschied.

        Du übergibst eine Funktion als Parameter.

        Das ist praktisch das gleiche wie

        AvarageTimeInterval().then(function (val) {
            console.log('Rückgabewert der Funktion=' + val);
        });
        

        @roga sagte in Test SQL-Abfrage:

        Was mir jedoch daran nicht gefällt ist, dass dafür nochmals eine async Function getValue() erstellt werden muss

        Hast Du mit meinem Beispiel auch getan - nur dass diese Funktion anonym ist (also keinen Namen hat).

        R 1 Reply Last reply Reply Quote 0
        • haus-automatisierung
          haus-automatisierung Developer Most Active @ticaki last edited by

          @ticaki sagte in Test SQL-Abfrage:

          aber wenn das Skript nicht ganz eingelesen ist, kommt es vor, das Funktionen und Variablen die später als der Aufruf definiert werden, Fehler erzeugen.

          Eigentlich nicht - siehe "hoisting"

          1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @ticaki last edited by

            @ticaki sagte: Funktionen und Variablen die später als der Aufruf definiert werden, Fehler erzeugen.

            Nur Deklarationen mit const und let müssen vor ihrer Verwendung erfolgen.
            Um zusätzlichen Compiler-Durchlauf zu vermeiden, sollten alle Deklarationen vor ihrer Verwendung erfolgen.

            T 1 Reply Last reply Reply Quote 1
            • T
              ticaki Developer @paul53 last edited by ticaki

              @paul53

              2023-07-26 23:38:23.346  - error: javascript.0 (29336) script.js.Messages.Sensorüberwachung: ReferenceError: Cannot access 'stateDef' before initialization
              2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at readDP (script.js.Messages.Sensorüberwachung:116:23)
              2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at work (script.js.Messages.Sensorüberwachung:36:21)
              2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at init (script.js.Messages.Sensorüberwachung:19:5)
              2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at script.js.Messages.Sensorüberwachung:107:1
              2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at script.js.Messages.Sensorüberwachung:167:3
              2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at Script.runInContext (node:vm:135:12)
              

              Das stand gestern im log, dann hab ich init() ans ende geschoben und alles war gut.

              falls es relevant ist:

              async function init() {
                  if (!existsState(path)) await createFolderAsync(path, 'Geräteüberwachung')
                  work()
                  return Promise.resolve(true);
              }
              
              const stateDef = {
                  "id": {"type": "string", "def":"", "desc": "diese Id"},
                  "dp": {"type": "string", "def":"", "desc": "ursprüngliche ID"},
                  "art": {"type": "string", "def":"ts", "desc": "ts, lc, true, false Worauf geprüft werden soll"},
              
              haus-automatisierung 1 Reply Last reply Reply Quote 0
              • haus-automatisierung
                haus-automatisierung Developer Most Active @ticaki last edited by haus-automatisierung

                @ticaki sagte in Test SQL-Abfrage:

                Das stand gestern im log, dann hab ich init() ans ende geschoben und alles war gut.

                Achso, ich dachte es geht um eine Funktions-Deklaration. Daher der Hinweis auf Hoisting.

                Da ist natürlich der Hinweis von @paul53 korrekt, dass Du die Variablen mit const und let vor der Verwendung deklarieren musst. Das ist hier ja nicht passiert (falls Du weiter oben darauf zugreifst - das ist ja sicher nicht das komplette Script?)

                T 1 Reply Last reply Reply Quote 1
                • T
                  ticaki Developer @haus-automatisierung last edited by

                  @haus-automatisierung
                  @paul53

                  Was gelernt, das müssen hab ich überlesen, fett war es besser zu sehen, jetzt kann ichs genau erklären. Danke

                  1 Reply Last reply Reply Quote 0
                  • R
                    ROGA @haus-automatisierung last edited by

                    @haus-automatisierung sagte in Test SQL-Abfrage:

                    @roga sagte in Test SQL-Abfrage:

                    Was mir jedoch daran nicht gefällt ist, dass dafür nochmals eine async Function getValue() erstellt werden muss

                    Hast Du mit meinem Beispiel auch getan - nur dass diese Funktion anonym ist (also keinen Namen hat).

                    Oh weh!! Habe ich nicht geschnallt 😞 Aber ja, jetzt wo du es mir erklärt hast, sehe ich das auch.

                    Ich bin an ein weiteres Problem gestossen, das mir wieder Kopfzerbrechen macht. Ich wollte eigentlich im Hauptprogramm eine globale Variable haben, die den Rückgabewert meiner Funktion enthält und mit der ich überall arbeiten kann. Ich habe mir das sinngemäss zuerst so vorgestellt:

                    Temperatur = AvarageTimeInterval()
                    

                    So kannte ich das eigentlich von VBS, das ging dann aber hier leider nicht. Danach habe ich versucht, das neu gelernte anzuwenden:

                    AvarageTimeInerval().then(function(val) {
                       Temperatur = val;
                    };
                    
                    Console.log("Temperatur=" + Temperatur);
                    

                    Ich dachte nun, das muss ja jetzt klappen, aber weit gefehlt 😞 Wieder gab es keinen Wert in der Variable Temperatur und ich fange langsam an, zu verzweifeln. Irgendwo habe ich einen ganz dicken Knoten der nicht aufgehen möchte ....

                    Kann mir das nochmal jemand vereinfacht erklären was jetzt wieder falsch gelaufen ist, oder muss ich hier die Flinte ins Korn werfen und mir eine andere Beschäftigung suchen????

                    T haus-automatisierung 2 Replies Last reply Reply Quote 0
                    • T
                      ticaki Developer @ROGA last edited by ticaki

                      @roga

                      Die Ausführungsreihenfolge in deinem Skript ist so:

                      1: AvarageTimeInerval().then(function(val) {
                         3: Temperatur = val;
                      };
                      
                      2: Console.log("Temperatur=" + Temperatur);
                      

                      Wenn du eine Ablaufreihenfolge haben möchtest die jeweils wartet dann am besten imho:

                      async function main() {
                        Temperatur = await AvarageTimeInerval()
                       
                        Console.log("Temperatur=" + Temperatur);
                      }
                      main()
                      

                      sehe das nicht als zusätzliche Funktion sondern setzte einfach dein ganzes Skript in die main() funktion, sollte eigentlich problem los funktionieren, solange du sie nicht wiederholt aufrufst.

                      1 Reply Last reply Reply Quote 0
                      • haus-automatisierung
                        haus-automatisierung Developer Most Active @ROGA last edited by haus-automatisierung

                        @roga sagte in Test SQL-Abfrage:

                        und ich fange langsam an, zu verzweifeln. Irgendwo habe ich einen ganz dicken Knoten der nicht aufgehen möchte ....

                        Der Code in der Callback-Funktion wird später ausgeführt. das läuft asynchron ab! das ist ja der Sinn von Promises. Du musst den Code also umbauen. Nur INNERHALB der Funktion kannst Du das Ergebnis wirklich sicher verwenden. Bitte nochmal mit asynchronem Code beschäftigen. Das restliche Programm läuft weiter, während deine SQL-Abfrage auf ein Ergebnis wartet. Das ist ja der Sinn des Ganzen.

                        Du sagst quasi nur "hier liebe Funktion, mach mal. Und gib mir mit einem Aufruf in dieser Funktion bescheid, wenn Du fertig bist".

                        @ticaki hat das ja gut veranschaulicht.

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        887
                        Online

                        31.8k
                        Users

                        80.0k
                        Topics

                        1.3m
                        Posts

                        4
                        20
                        379
                        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