NEWS
Problem mit await setStateAsync()
-
Hallo,
jetzt dachte ich, dass ich es verstanden habe, aber es funktioniert nicht wie von mir erwartet. Wenn ichawait setStateAsync()
aufrufe, sollte doch ein anschliessendesgetState()
korrekte Werte liefern, oder liege ich da falsch?
Ohne zusätzlicheswait()
in Zeile 12 wirft JSON.parse() in Zeile 13 einen Fehler, weil die Werte wohl noch nicht fertig geschrieben sind. Mit funktioniert allesEdit: Nach einem Neustart des Systems war es wesentlich schneller, so dass ich das gezeigte mit den wenigen zu schreibenden Daten im Beispiel nicht mehr nachvollziehen kann. Mit den Originaldaten(>1000 Datensätze) bleibt das Beschriebene aber
(JS-Adapter: 4.9.7, Node: 14.15.0, NPM: 6.14.8)
async function getData() { await setStateAsync('0_userdata.0.example_state', ''); await setStateAsync('0_userdata.0.example_state', '{"A":1,"B":2}'); return true; } async function main(refresh = false) { if(refresh){ if(!await getData()) return log('No data'); } //ohne wait() Fehler bei JSON.parse(getState()) //await wait(100); let x = JSON.parse(getState('0_userdata.0.example_state').val); log(x) } main(true);
14:08:42.588 info javascript.0 (12740) Start javascript script.js.Aktiv.tst 14:08:42.593 info javascript.0 (12740) script.js.Aktiv.tst: registered 0 subscriptions and 0 schedules 14:08:42.643 error javascript.0 (12740) script.js.Aktiv.tst: SyntaxError: Unexpected end of JSON input 14:08:42.644 error javascript.0 (12740) at b (script.js.Aktiv.tst:13:18)
-
-
@fastfoot sagte in Problem mit await setStateAsync():
sollte doch ein anschliessendes getState() korrekte Werte liefern, oder liege ich da falsch?
Probier es bitte mal mit
await getStateAsync
stattgetState
. Nicht auszuschließen, dass der Cache im Skript-Adapter hier auf die Parade regnet. -
@liv-in-sky sagte in Problem mit await setStateAsync():
wie sieht es damit aus
if(!(await getData())) return log('No data');
Im Original habe ich es tatsächlich so wie von dir gezeigt, und denke mittlerweile auch dass das so richtig ist.
-
@AlCalzone sagte in Problem mit await setStateAsync():
@fastfoot sagte in Problem mit await setStateAsync():
sollte doch ein anschliessendes getState() korrekte Werte liefern, oder liege ich da falsch?
Probier es bitte mal mit
await getStateAsync
stattgetState
. Nicht auszuschließen, dass der Cache im Skript-Adapter hier auf die Parade regnet.Danke, das funktioniert zuverlässig! Es verwirrt mich allerdings ziemlich
Was mich etwas 'stört' an dieser ganzen async/await Sache, gefühlt steht jetzt überall await vor den Funktionen. Ist das meinem Programmierverhalten in herkömmlichen Sprachen geschuldet und sollte ich das ändern, damit es besser zu der Asynchronizität von JS passt? Zur Zeit habe ich etwas das Gefühl dass ich JS dadurch nicht voll in seinen Möglichkeiten ausschöpfe?
Noch etwas ist mir aufgefallen und hat mich viel Zeit gekostet: Mit getState() kann ich id-Akürzungen für States in z.B. javascript.0 benutzen, also
getState('test')
, mit getStateAsync() muss ich zwingendgetStateAsync('javascript.0.test')
benutzen. Scheint dass das jetzt zukünftig meine BestPractice wirdAusserdem muss man scheinbar Klammern nutzen, um einen Wert bei getStateAsync() zu erhalten also
let x = (await getStateAsync(id)).val
. Ist das korrekt? -
@fastfoot sagte in Problem mit await setStateAsync():
Was mich etwas 'stört' an dieser ganzen async/await Sache, gefühlt steht jetzt überall await vor den Funktionen.
Das ist völlig normal - du solltest mal sehen, wie viel ich das in meinem Code nutze.
Das eigentliche Problem mit dem getState liegt daran, dass der Adapter eigentlich alle States zwischenspeichert und synchronisiert, sodass du in Skripten synchron und ohne Callback darauf zugreifen kannst. Das scheint allerdings nicht immer zuverlässig zu gehen. Müsste sich mal jemand ansehen.
@fastfoot sagte in Problem mit await setStateAsync():
Ausserdem muss man scheinbar Klammern nutzen, um einen Wert bei getStateAsync() zu erhalten
Das leider korrekt.
@fastfoot sagte in Problem mit await setStateAsync():
mit getStateAsync() muss ich zwingend getStateAsync('javascript.0.test') benutzen
Das sollte eigentlich nicht sein. Ist
test
nur ein Beispiel oder ein State, bei dem es nicht geht? Sind in den betroffenen IDs Punkte enthalten? -
@AlCalzone sagte in Problem mit await setStateAsync():
Das ist völlig normal - du solltest mal sehen, wie viel ich das in meinem Code nutze.
na das beruhigt mich, als Anfänger in JS habe ich immer Zweifel
Müsste sich mal jemand ansehen.
soll ich ein issue aufmachen?
@fastfoot sagte in Problem mit await setStateAsync():
mit getStateAsync() muss ich zwingend getStateAsync('javascript.0.test') benutzen
Das sollte eigentlich nicht sein. Ist
test
nur ein Beispiel oder ein State, bei dem es nicht geht? Sind in den betroffenen IDs Punkte enthalten?nee, habe es mit genau der ID probiert. was mich soviel Zeit gekostet hat war dass ich in obigem Beispiel 0_userdata.... benutzt hatte, in meinem Originalcode jedoch nach javascript.0.xxxx schreibe. Nach der Änderung zu getStateAsync() hatte ich aber immer noch die verkürzte ID benutzt und nur Fehler bekommen, die gleich/ähnlich dem Timingfehler waren ==> Jetzt kann ich diesen Fehler nicht mehr reproduzieren wenn tst im root von javascript.0 liegt. Aber wenn ich von
Tests.tst
lese schon, dann muss ichjavascript.0.Tests.tst
nehmen mit getStateAsync()
Hier nochmal das umgebaute Skript mit Kommentaren und Datengenerator für den Timing Fehler nach await setState()async function getData(){ let x = []; for(let i = 0; i < 5e0; i++){ x.push({"A":i,"B":i+1}) } await setStateAsync('javascript.0.Tests.tst', ''); await setStateAsync('javascript.0.Tests.tst', JSON.stringify(x)); return true; } async function main(refresh = false){ if(refresh){ if(!(await getData())) return log('No data'); } //ohne wait() Timing Fehler //await wait(500); //let x = JSON.parse(getState('Tests.tst').val); //funktioniert ohne wait(), benötigt vollen Pfad let x = JSON.parse((await getStateAsync('javascript.0.Tests.tst')).val); //verkürzte ID wirft Fehler //let x = JSON.parse((await getStateAsync('Tests.tst')).val); log(x) } main(true);
-
@fastfoot sagte in Problem mit await setStateAsync():
Jetzt kann ich diesen Fehler nicht mehr reproduzieren wenn tst im root von javascript.0 liegt.
Das deckt sich mit dem was ich im Code gesehen habe. Ist etwas ungeschickt, das könnte man bestimmt abhängig vom Adapterpräfix machen