Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [gelöst] Was ist der Scriptcontext?

    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

    [gelöst] Was ist der Scriptcontext?

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

      @oliverio Danke, das ist sicher für die meisten eine nette Erklärung, aber welchen Context muss ich an eine im Script befindliche Funktion binden, damit die ihren Context behält?

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

        @great-sun
        so wie ich geschrieben habe.
        entweder ein objekt oder variable, die du ausserhalb definiert hast
        oder bspw this.
        je nachdem was du benötigst um beim aufruf der callback-funktion weiterarbeiten zu können.
        das kann halt nicht pauschal beantwortet werden, da das von der funktion an sich abhängt.
        wenn du einen debugger verwenden würdest, dann würdest du sehen, in welcher Zeile, welche Scope/Kontexte verfügbar sind.

        Hast du den kein Code-Beispiel oder Doku, aus der du diese Informationen hast?
        So aus 2.Hand lässt sich das nicht sagen

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

          @oliverio

          function getObjectValue(objectPath) {
              return getState(objectPath).val;
          }
          const autoConfigClass = new AutoConfigClass(getObjectValue.bind(this));
          

          Da weder this noch global oder globalThis hier zu funktionieren scheinen, kommt halt immer wieder:

          TypeError: this.getObjects is not a function
          
          OliverIO 2 Replies Last reply Reply Quote 0
          • OliverIO
            OliverIO @Great SUN last edited by

            @great-sun sagte in Was ist der Scriptcontext?:

            AutoConfigClass

            die doku zu AutoConfigClass

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

              @oliverio Das ist was selbstgeschriebenes.

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

                @great-sun sagte in Was ist der Scriptcontext?:

                this.getObjects

                dies erscheint leider in deinem Beispielcode nirgends

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

                  @great-sun sagte in Was ist der Scriptcontext?:

                  Das ist was selbstgeschriebenes

                  von dir? dann müsstest doch wissen was da übergeben wird.
                  Wenn von jemand anderem, dann den code hier posten oder denjenigen Fragen

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

                    @oliverio

                    Ich hab ein Script das ganz normal unter Scripte im ioBroker läuft. In dem ist die Funktion

                    function getObjectValue(objectPath) {
                        return getState(objectPath).val;
                    }
                    

                    Und von dort aus initialisiere ich die Klasse, der ich die lokale Funktion als Callback übergeben will,
                    Das funktionier ausserhalb mit zwei Klassen Problemlos, aber in ioBroker finde ich scheinbar einfach nicht den richtigen binding context.

                    in der Klasse ist das einfach so:

                    constructor(getObjects) {
                        this.getObjects = getObjects;
                    }
                    

                    Später wird dann halt irgendwo die Methode this.getObjects mit dem entsprechenden Pfad aufgerufen.
                    Wenn ich bei der Instanziierung also den richtigen Binding-Context übergebe, sollte das rein in meiner Theorie funktionieren.

                    Siehst Du das irgendwie anders?

                    Ein Beispiel mit zwei Klassen, das funktioniert:
                    PlayCode Beispiel

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

                      @great-sun

                      und woher hast du, das du da einen Kontext übergeben musst?
                      Aktuell musst du da gar nichts übergeben, da getState ja auch innerhalb des Objekts AutoConfigClass funktioniert, da es generell vom iobroker als Befehl bereitgestellt wird.
                      Alternativ übergebe nur den ObjectPath an das Objekt

                      Auch wenn ich dir das nicht rate, weil das viel zu kompliziert und nicht mehr lesbar wäre, kann man einen funktionsaufruf inklusive der Parameter einfrieren und zur späteren Ausführung aufheben.

                      Das wäre dann
                      apply
                      Aber das habe ich noch nie verwendet.

                      übertragen auf dein erstes Beispiel müsste es dann so aussehen

                      const autoConfigClass = new AutoConfigClass(getObjectValue.apply(null,"javascript.0.test1"));
                      

                      Der Inhalt des Parameters muss dann aber bekannt sein, sonst macht das keinen Sinn.

                      1 Reply Last reply Reply Quote 0
                      • Great SUN
                        Great SUN last edited by

                        Na toll....
                        Das Problem war... Er hat mir beim Aufruf einer globalen Funktion noch eine andere Instanziierung gemacht, an die ich gar nicht mehr gedacht hatte. Im Log stand dann halt nur das Script, das ich ausgeführt hab, weswegen ich immer wieder dachte, das hängt an dem Script....

                        Danke trotzdem fürs Engagement und die beständige Hilfe/Suche nach dem Fehler.

                        Pebcak 😞

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

                          @great-sun

                          noch ne anmerkung zu deinem playground

                          alle required anweisungen an den anfang stellen.
                          insbesondere willst du das nicht immer wieder neu ausführen (handeData)

                          sich innerhalb einer instanziierung eines objektes nicht veränderlichen daten, sollten auch nicht immer wieder neu berechnet werden handleData,Berechnung filePath

                          Wiederholter Dateizugriff auf die gleiche Ressource innerhalb kürzester Zeit gilt als inperformant. Daher sollten die Daten im Speicher gesammelt werden und dann nur einmal geschrieben werden. In der Schleife wird saveHash innerhalb weniger Millisekunden mehfach aufgerufen.

                          Die Übergabe des Callbacks müsste eigentlich auch ganz simple funktionieren
                          const testClass = new TestClass(dataClass.handleData);
                          in TestClass wird der Functionpointer dann gespeichert und später dann in setData zusammen mit den Parametern aufgerufen.

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

                            Generell bin ich voll bei Dir, das war nur zur Vereinfachung, dass jeder weiß, was gemeint/genutzt wird im playground.

                            Die Übergabe des Callbacks müsste eigentlich auch ganz simple funktionieren
                            const testClass = new TestClass(dataClass.handleData);
                            in TestClass wird der Functionpointer dann gespeichert und später dann in setData zusammen mit den Parametern aufgerufen.

                            Das geht nur mit .bind(dataClass) sonst heißt es is not a function 😉

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

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            902
                            Online

                            31.9k
                            Users

                            80.1k
                            Topics

                            1.3m
                            Posts

                            2
                            14
                            293
                            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