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. Skripten / Logik
  4. JavaScript
  5. [gelöst] Was ist der Scriptcontext?

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.4k

[gelöst] Was ist der Scriptcontext?

Geplant Angeheftet Gesperrt Verschoben JavaScript
14 Beiträge 2 Kommentatoren 753 Aufrufe 2 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.
  • Great SUNG Great SUN

    @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?

    OliverIOO Offline
    OliverIOO Offline
    OliverIO
    schrieb am zuletzt editiert von
    #4

    @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

    Meine Adapter und Widgets
    TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
    Links im Profil

    Great SUNG 1 Antwort Letzte Antwort
    0
    • OliverIOO OliverIO

      @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 SUNG Offline
      Great SUNG Offline
      Great SUN
      schrieb am zuletzt editiert von Great SUN
      #5

      @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
      
      OliverIOO 2 Antworten Letzte Antwort
      0
      • Great SUNG 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
        
        OliverIOO Offline
        OliverIOO Offline
        OliverIO
        schrieb am zuletzt editiert von
        #6

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

        AutoConfigClass

        die doku zu AutoConfigClass

        Meine Adapter und Widgets
        TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
        Links im Profil

        Great SUNG 1 Antwort Letzte Antwort
        0
        • OliverIOO OliverIO

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

          AutoConfigClass

          die doku zu AutoConfigClass

          Great SUNG Offline
          Great SUNG Offline
          Great SUN
          schrieb am zuletzt editiert von
          #7

          @oliverio Das ist was selbstgeschriebenes.

          OliverIOO 1 Antwort Letzte Antwort
          0
          • Great SUNG 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
            
            OliverIOO Offline
            OliverIOO Offline
            OliverIO
            schrieb am zuletzt editiert von
            #8

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

            this.getObjects

            dies erscheint leider in deinem Beispielcode nirgends

            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
            • Great SUNG Great SUN

              @oliverio Das ist was selbstgeschriebenes.

              OliverIOO Offline
              OliverIOO Offline
              OliverIO
              schrieb am zuletzt editiert von OliverIO
              #9

              @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

              Meine Adapter und Widgets
              TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
              Links im Profil

              Great SUNG 1 Antwort Letzte Antwort
              0
              • OliverIOO 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 SUNG Offline
                Great SUNG Offline
                Great SUN
                schrieb am zuletzt editiert von Great SUN
                #10

                @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

                OliverIOO 1 Antwort Letzte Antwort
                0
                • Great SUNG 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

                  OliverIOO Offline
                  OliverIOO Offline
                  OliverIO
                  schrieb am zuletzt editiert von OliverIO
                  #11

                  @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.

                  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
                  • Great SUNG Offline
                    Great SUNG Offline
                    Great SUN
                    schrieb am zuletzt editiert von
                    #12

                    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 :-(

                    OliverIOO 1 Antwort Letzte Antwort
                    0
                    • Great SUNG Great SUN

                      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 :-(

                      OliverIOO Offline
                      OliverIOO Offline
                      OliverIO
                      schrieb am zuletzt editiert von
                      #13

                      @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.

                      Meine Adapter und Widgets
                      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                      Links im Profil

                      Great SUNG 1 Antwort Letzte Antwort
                      0
                      • OliverIOO OliverIO

                        @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 SUNG Offline
                        Great SUNG Offline
                        Great SUN
                        schrieb am zuletzt editiert von
                        #14

                        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 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

                        625

                        Online

                        32.6k

                        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