NEWS
setStateAsync in externem js-file evtl mit require??
-
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 FunktionensetState und setStateAsync
sind in der ausgelagerten Datei nicht verfügbar!
Ich vermute, man muss am Anfang der ausgelagerten Datei einrequire
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- Eine Lösung
- 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.
-
@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.
-
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);
-
@oliverio
ist das neue? letztes oder vorletztes Jahr ging das noch mitthis
-
@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.
-
@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, denthis
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 mitmy = 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!
-
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/closuresowie 2.15-2.17 + 6.6,6.7,6.10,6.11