NEWS
Bei bestimmtem String stürzt Javascript Instanz ab
-
@codierknecht nein
-
@ben1983 sagte in Bei bestimmtem String stürzt Javascript Instanz ab:
@codierknecht nein
Hatte ich mir jetzt schon gedacht, wenn @ticaki das reproduzieren kann.
Hilft also nur, auf einen Fix zu warten oder sicherzustellen, dass der Wert in der benötigten Form verwendet wird. -
Das hier geht:
onMessage("TimeBeforeOrEqualNow",(messagedata,callback)=>{ const now = new Date(); const actualTime = `${now.getHours()}:${now.getMinutes()}`; log(messagedata.time <= actualTime); log(messagedata.time); log(actualTime) callback({result: !!(messagedata.time <= actualTime)}); }); async function checkTime(){ try { const ausgabe = await messageToAsync("TimeBeforeOrEqualNow",{time:"9:33"},{timeout:5000}); log(ausgabe.result) } catch(e) { log (e.message) log ('error2') } }
Der Absturz der Instanz kommt von dem fehlenden
try{};catch
um denawait
. Das ist so auch richtig.Der Bug liegt daran das messageToAsnc einen Wert als Rückgabe erwartet und "false" als kein Wert interpretiert wird. Denke ich mal. @haus-automatisierung ?
-
oder log fängt zirkular referenzen nicht ab und loggt sich zu tode
log(messagedata);
weiß allerdings nicht, wie groß das objekt ist.
-
@oliverio sagte in Bei bestimmtem String stürzt Javascript Instanz ab:
oder log fängt zirkular referenzen nicht ab und loggt sich zu tode
log(messagedata);
weiß allerdings nicht, wie groß das objekt ist.
Da die Funktion mit Rückgabewert
true
funktioniert und beifalse
den Errorunknown error
zurück gibt, denke ich nicht, dass es das ist.Code des TE nur um catch try erweitert
8:33 <= 10:46 == false
Weil 8 > 110:46:15.827 info javascript.0 (9472) script.js.Test.Skript_122: registered 0 subscriptions, 0 schedules, 1 message, 0 logs and 0 file subscriptions 10:46:15.831 info javascript.0 (9472) script.js.Test.Skript_122: {'time':'8:33'} 10:46:15.831 info javascript.0 (9472) script.js.Test.Skript_122: 8:33 10:46:15.831 info javascript.0 (9472) script.js.Test.Skript_122: 10:46 10:46:15.834 info javascript.0 (9472) script.js.Test.Skript_122: Unknown error
Von dem Fehler abgesehen halte ich nichts davon "Zahlen" per Stringvergleich zu vergleichen. Das hier ist da imho besser:
const now = new Date() const actualTime = now.getHours()+now.getMinutes()/60; const time = '8:33'; const timeAsArray = time.split(':') const timeAsNumber = Number(timeAsArray[0]) + Number(timeAsArray[1])/60 log(timeAsNumber <= actualTime);
EDIT: Wie immer einen kleinen dämlichen Fehler im Code behoben
-
@ticaki sagte in Bei bestimmtem String stürzt Javascript Instanz ab:
Der Bug liegt daran das messageToAsnc einen Wert als Rückgabe erwartet und "false" als kein Wert interpretiert wird. Denke ich mal. @haus-automatisierung ?
Das sollte auch funktionieren:
Du gibst ja als Objekt
{ result: false }
zurück und nicht einfach nurfalse
. -
Der TE gibt im seinem Beispiel code dort obenfalse
zurück.Oh sehe gerade das im Beispielcode auch ein Objekt zurück gegeben wird.
https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#messagetoasyncAber ist es da wirklich zwingend das ein Objekt (oder ein Wert != null/undefined/0/''/false) zurück gegeben werden muß?
if (res && res.error) { reject(res.error); } else { resolve(res); }
Wäre doch da sinnvoller oder? Kann gerne ne PR machen, hab gesehen dass das Verhalten sich in allen sendToAsync Varianten wiederholt.
-
@ticaki sagte in Bei bestimmtem String stürzt Javascript Instanz ab:
Aber ist es da wirklich zwingend das ein Objekt (oder ein Wert != null/undefined/0/''/false) zurück gegeben werden muß?
Aktuell ja. Das ist analog zu sendTo implementiert. Würde das nicht umstellen - was ist der Mehrwert? Die Blockly-Bausteine generieren den Code ja momentan auch so, dass immer ein Objekt zurückgeliefert wird:
Intern ist das ja ein einfaches sendTo. Und da arbeitet man ja eigentlich immer mit Objekten. Finde ich auch sauber gelöst.
-
@haus-automatisierung
Da ist kein Vorteil, nur das im sendTo() für jsonConfig.json bei textSendTo ein String erwartet wird(kein Object), daher meine Fehlannahme. -
@ticaki Stimmt, wäre schöner wenn auch der Admin für
textSendTo
dannresult.text
nutzen würde und man auch dort ein Objekt zurückliefert. -
@haus-automatisierung ok.
Dann sollte ja async meineFunktion.result gehen, oder?
Trotzdem stürzt ja komischerweise die Instanz ab… obwohl nur der Rückgabewert geloggt werden soll. Sollte das nicht trotzdem gehen? -
@ben1983 sagte in Bei bestimmtem String stürzt Javascript Instanz ab:
Dann sollte ja async meineFunktion.result gehen, oder?
Wenn Du ein Objekt an die Callback-Funktion übergibst, ja. So wie in der Doku zu finden.
PS: Strings mit <> zu vergleichen ist so eine Sache... da wirst Du noch Probleme bekommen (je nachdem ob eine 0 vorangestellt wird, oder nicht):
-
@ben1983 sagte in Bei bestimmtem String stürzt Javascript Instanz ab:
@haus-automatisierung ok.
Dann sollte ja async meineFunktion.result gehen, oder?
Trotzdem stürzt ja komischerweise die Instanz ab… obwohl nur der Rückgabewert geloggt werden soll. Sollte das nicht trotzdem gehen?Oben steht doch die Lösung die geht...
-
@haus-automatisierung ok danke.
Ja denke mache es so, dass ich wirklich den String splitten werde, denn nur aus einer Zeit kann man ja mit Date() nichts erzeugen. Werde dann auch ein Objekt übergeben.Nur ne Frage: wie kann es denn sein, dass der Fehler jemandem den ioBroker zerschießt?
-
@ben1983 sagte in Bei bestimmtem String stürzt Javascript Instanz ab:
Nur ne Frage: wie kann es denn sein, dass der Fehler jemandem den ioBroker zerschießt?
Eigentlich gar nicht. Mindestens der JavaScript-Adapter läuft ja in einem eigenen Prozess (außer der Compact-Mode ist aktiviert). Gibt da für mich keine technisch Erklärung für.
Wenn ich das fehlerhafte Script nun so nehme und ausprobiere, passiert wahrscheinlich wieder gar nix
-
@haus-automatisierung OK. Wundert mich jetzt auch etwas.
Hier mein finaler Code, der funktioniert.
Sollte das so ok sein?// Prüfen,ob die angegebenen Zeit vor oder gleich der aktuellen ist onMessage("TimeBeforeOrEqualNow",(messagedata,callback)=>{ const now = new Date(); const inputTime = new Date(`${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}-${messagedata.time}`); if(inputTime){ callback({result:inputTime <= now}); } else{ callback({result:false}); } }); async function checkTime(){ log((await messageToAsync("TimeBeforeOrEqualNow",{time:"8:33"},{timeout:5000})).result); } checkTime();
@haus-automatisierung ich stehe nur irgendwie noch auf dem Schlauch, wie ich das in meine Logik unterbringen soll?
Also ich habe einen Trigger durch "$Selector.on((obj)=>{....}wenn ich jetzt darin die Funktion nutzen möchte, kann ich ja gar kein await nutzen, da es nicht in einer async funktion ist.
Somit würde ja die If Abfrage mit "undefined" abgehakt werden, bevor ein result zurückkommen kann. -
@ben1983 sagte in Bei bestimmtem String stürzt Javascript Instanz ab:
wenn ich jetzt darin die Funktion nutzen möchte, kann ich ja gar kein await nutzen, da es nicht in einer async funktion ist.
Warum nicht? Mach doch eine draus.
on({id:'dein.dp.oder.selektor', change:"ne"}, async function () { // hier geht auch await });
-
@codierknecht Danke... oh man, da bin ich gar nicht drauf gekommen, da es eine Arrow Function ist