Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. setStateAsync in externem js-file evtl mit require??

    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

    setStateAsync in externem js-file evtl mit require??

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

      Hallo zusammen!
      Ich habe eine JS-Funktion, die eine ausgelagerte Funktion aufruft:

      // Beschreibe diese Funktion …
      async function mywrite(cmd) {
          my = require('../../../iobroker-data/modules/mod1.js');
          result = await my.mywrite(cmd);
      // weiteres
          return result;
      }
      

      die Datei mod1.js lautet

      async function mywrite(cmd) { 
      // do some stuff
      // hier soll der iobroker-State 0_userdata.0.errstate auf true gesetzt werden, nur wie geht das????
        return myresult; 
      }
      
      

      Wie setzt man in dieser augelagerten Datei einen iobroker-state 0_userdata.0.errstate??
      Die Funktionen setState und setStateAsync sind in der ausgelagerten Datei nicht verfügbar!
      Ich vermute, man muss am Anfang der ausgelagerten Datei ein require einfügen. Nur welches Module und wie genau mache ich das?
      Ich habe im Netz mir einen Wolf gesucht, daher wäre ich dankbar über

      1. Eine Lösung
      2. Einen Hinweis nach welchen Stichworten ich hätte suchen müssen, um die Lösung selbst herauszufinden.

      Danke!

      Warum die ausgelagerte Datei? Weil die Funktion dort sehr lange ist und immer mal wieder geändert werden muss und in vielen Skripten Verwendung findet. Mir ist bekannt, dass ich den javascript-Adapter nach jeder Änderung dieser ausgelagerten Datei neu starten muss. Und bisher möchte ich mich nicht in die Adapter-Entwicklung einarbeiten, außer es geht nicht anders.

      Asgothian OliverIO 2 Replies Last reply Reply Quote 0
      • Asgothian
        Asgothian Developer @Axel21 last edited by Asgothian

        @axel21 ich würde das so lösen:

        async function mywrite(cmd, setStateFunc) { 
        // do some stuff
          if (typeof setStateFunc === "function") await setStateFunc('0_userdata.0.errstate', true)
        // hier soll der iobroker-State 0_userdata.0.errstate auf true gesetzt werden, nur wie geht das????
          return myresult; 
        }
        

        Aufruf mit

        await mywrite(cmd, setStateAsync);
        

        A.

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

          @axel21

          wenn man globalThis mit übergibt, bekommt man einen zeiger auf den aktuellen kontext in dem dann alle befehle verfübar sind

          function test(iob) {
              console.log(iob);
              iob.setStateAsync(......
          }
          test(globalThis);
          
          T 1 Reply Last reply Reply Quote 0
          • T
            ticaki Developer @OliverIO last edited by

            @oliverio
            ist das neue? letztes oder vorletztes Jahr ging das noch mit this

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

              @ticaki
              Habe jetzt erst danach geschaut.
              Weiß nicht wann das eingeführt wurde.

              this könnte schwierig sein, wenn du dich in einem objekt kontext befindest. da ist dann this uU nicht identisch.

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

                @oliverio @ticaki @Asgothian
                Ein ganz herzliches Dankeschön! Drei Lösungen, die funktionieren. 🙂

                @oliverio @ticaki:
                Aus Euren Beiträgen habe ich verstanden, warum ich beim Suchen im Netz nicht fündig wurde: Ich habe nach dem Falschen gesucht. Ich wollte die gesuchte Funktion erneut einbinden. Jetzt habe ich verstanden, dass es darum geht, den this Kontext mit zu übergeben. Dann kann ich in der include-Datei auf alles was ich möchte zugreifen - wunderbar!
                Mit dieser Lösung kann ich meinen state iobroker-State 0_userdata.0.errstate im Fehlerfall setzten und diesen im Hauptprogramm dann mit einer Fehlerbehandlung weiterverfolgen. Das ist genau das, was ich für mein großes Script brauche, das einen größeren Ablauf steuert und im Fehlerfall dann in den "Error"-Zustand versetzt wird. Prima!

                @Asgothian: Auch Deine Lösung, eine Funktion mit zu übergeben, funktioniert.
                Durch Deinen Post habe ich nocheinmal über eine callback-Funktion nachgedacht. Denn in einem anderen main Skript möchte ich - ohne states - einfach nur die Variable senderror im main-Prog durch das Include-Prg. setzen.

                Das hatte ich zunächst verworfen, denn ich dachte fälschlicherweise, die callback-Funktion wird im context der include-Datei ausgeführt und damit wäre das Setzen meiner senderror-Variable des main-Programmes in diesem context nicht möglich.
                Dennoch funktioniert es!
                Wenn ich also (in einem anderen Skript) nur einen Schreibbefehl habe, dann kann ich mit

                 my = require('../../../iobroker-data/modules/mod1.js');
                 result = await my.mywrite(cmd, (h) => {senderror=(h)});
                

                meine Variable errstate im main-Programm setzten und direkt abfragen, wenn ich in der includedatei mod1.js die callbackfunktion aufrufe.

                async function mywrite(cmd, callback) { 
                // do some stuff
                // im Fehlerfall: 
                callback("ERROR77");
                return myresult; 
                }
                

                Dass dies funktioniert, zeigt, dass ich noch einiges zu lernen habe über JS-scopes und JS-this (das anders ist als java-this). Bei der Internetrecherche bin ich dann auf .call und .bind gestoßen und .... Puh, es ist kompliziert.

                Dabei will ich ja eigentlich nur ein einfaches #include(mod1.js). Das wäre so einfach, kein scope-Wechsel, kein require, kein this. Aber dass es #include nicht gibt, wurde in einem anderen Beitrag im Forum ja schon mehrfach erläutert.

                So damit habe ich jetzt zwei Lösungen. Eine "große" und eine "kleine" und ich sage nochmals

                D A N K E

                für die passenden und schnellen Lösungen!

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

                  @axel21

                  ja scopes ist schon ein Thema, was man erst nach einer weile versteht.
                  Wer kennt schon den Unterschied zwischen var und let oder einer normalen Function oder einer Arrow Function ()->
                  Hier gute quellen zur Erklärung.
                  https://javascript.info/variables
                  https://javascript.info/closure

                  sowie 2.15-2.17 + 6.6,6.7,6.10,6.11

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

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  827
                  Online

                  31.9k
                  Users

                  80.1k
                  Topics

                  1.3m
                  Posts

                  javascript
                  4
                  7
                  56
                  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