NEWS
[gelöst] Was ist der Scriptcontext?
-
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 Das ist was selbstgeschriebenes.
-
@great-sun sagte in Was ist der Scriptcontext?:
this.getObjects
dies erscheint leider in deinem Beispielcode nirgends
-
@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 -
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 -
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 ObjektAuch 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.
-
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
-
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. -
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