Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Javascript Funktion triggert ungewollt, wie verhindern?

    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

    Javascript Funktion triggert ungewollt, wie verhindern?

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      MCU @spaceduck last edited by MCU

      @spaceduck Gibt es Befehle wie port.close, port.open?

      https://serialport.io/docs/api-stream

      1 Reply Last reply Reply Quote 0
      • UncleSam
        UncleSam Developer @spaceduck last edited by

        @spaceduck versuche mal statt on() die Funktion once() zu verwenden - falls es die gibt.

        S 1 Reply Last reply Reply Quote 1
        • AlCalzone
          AlCalzone Developer @spaceduck last edited by AlCalzone

          @spaceduck

           parser1.on('data',
          

          fügt bei jedem Aufruf einen zusätzlichen Handler für das "data"-Event hinzu. D.h. jedes Mal wenn du die Funktion aufrufst, wird der definierte Callback einmal mehr als beim letzten Mal aufgerufen.
          Die Parser-Instanzen bleiben so auch bestehen, damit baust du dir nach und nach ein Memory-Leak.

          Korrekt wäre, beim Initialisieren einmal die Handler zu definieren und dann nicht pollen (jede Sekunde aufrufen), sondern auf eingehende Daten zu reagieren.

          S 1 Reply Last reply Reply Quote 0
          • S
            spaceduck @AlCalzone last edited by spaceduck

            @AlCalzone said in Javascript Funktion triggert ungewollt, wie verhindern?:

            fügt bei jedem Aufruf einen zusätzlichen Handler für das "data"-Event hinzu. D.h. jedes Mal wenn du die Funktion aufrufst, wird der definierte Callback einmal mehr als beim letzten Mal aufgerufen.
            Die Parser-Instanzen bleiben so auch bestehen, damit baust du dir nach und nach ein Memory-Leak.

            Danke für die Erklärung, macht Sinn!
            Der Controller sendet nur auf Anfrage, d.h. ich schicke einen Befehl, bekomme die Antwort fertig.
            Es werden keine zyklischen Werte gesendet worauf ich reagieren kann, daher muss ich das so lösen - es sei denn ich übersehe was (bin Javascript Anfänger).

            AlCalzone 1 Reply Last reply Reply Quote 0
            • S
              spaceduck @UncleSam last edited by

              @UncleSam said in Javascript Funktion triggert ungewollt, wie verhindern?:

              @spaceduck versuche mal statt on() die Funktion once() zu verwenden - falls es die gibt.

              Jo, super das klappt tatsächlich! Ich danke Dir!

              17:24:01.007	info	javascript.0 (24840) script.js.common.Test-1: Data1 send: ce3c0000f2
              17:24:01.172	info	javascript.0 (24840) script.js.common.Test-1: Data1 received: 02ce024886
              17:24:03.007	info	javascript.0 (24840) script.js.common.Test-1: Data2 send: 1101000010
              17:24:03.179	info	javascript.0 (24840) script.js.common.Test-1: Data2 received: 0211000112
              
              1 Reply Last reply Reply Quote 0
              • AlCalzone
                AlCalzone Developer @spaceduck last edited by

                @spaceduck sagte in Javascript Funktion triggert ungewollt, wie verhindern?:

                daher muss ich das so lösen

                Das kann man schon so strukturieren, dass du nicht für jeden Befehl einen neuen Handler registrieren musst.
                Mit once ist es vermutlich einfacher.

                Dennoch empfehle ich dir dringend, folgende Zeilen aus den Funktionen auszulagern und insgesamt nur 1x auszuführen:

                const parser1 = port.pipe(new ByteLength({ length: 5 }))
                

                Zwei verschiedene Parser, die gleich aufgebaut sind, brauchst du auch nicht (parser1, parser2).

                So wie du es derzeit machst, hast du nach jedem Aufruf einen zusätzlichen Parser, der mit Daten gefüttert wird. Nur sind alle bis auf den letzten unnötig, da du sie nicht auswertest.

                Nach 10 Aufrufen hast du dann 9 Stück, die Daten verarbeiten aber nicht genutzt werden. Nach 1000 Aufrufen sinds 999...

                S 1 Reply Last reply Reply Quote 1
                • S
                  spaceduck @AlCalzone last edited by

                  @AlCalzone
                  Danke erstmal, die Lernkurve ist steil...
                  Ich habe jetzt in beiden Funktionen nur noch "const parser = port..." -> Wäre das auch OK oder starte ich damit auch mit jedem Aufruf einen neuen Parser?

                  AlCalzone 1 Reply Last reply Reply Quote 0
                  • AlCalzone
                    AlCalzone Developer @spaceduck last edited by

                    Auch damit startest du mit jedem Aufruf einen neuen Parser. Mein Vorschlag: Ziehe die Erstellung des Parsers raus, dorthin wo du den Port erstellst.
                    In den Funktionen kannst du dann jeweils einen einmal-Handler mit once anhängen und nutzen.

                    S 1 Reply Last reply Reply Quote 1
                    • S
                      spaceduck @AlCalzone last edited by spaceduck

                      @AlCalzone
                      Danke Dir, hab es jetzt so umgesetzt und es klappt.

                      M 1 Reply Last reply Reply Quote 0
                      • M
                        MCU @spaceduck last edited by

                        @spaceduck Kannst du dann bitte Deine Lösung hier dokumentieren. Danke.

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        885
                        Online

                        31.8k
                        Users

                        80.0k
                        Topics

                        1.3m
                        Posts

                        javascript
                        4
                        11
                        473
                        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