NEWS
Asynchrone Funktionen innerhalb eine Subscribtion aufrufen
-
Dein Code haut mir regelmässig die Javascript Instanz kaputt. Mache mal in Zukunft um jeden await einen try{}catch(e){log(e.message)}. Eine Error Promise sollte zwar nur die Instanz abstürzen lassen, jedoch hauts bei mir mehr kaputtt. Wieso auch immer.
Edit: Backup eingespielt geht wieder alles.
-
Du mußt in jeder asynchronen Funktion die ein await benutzt ein try{}catch(){} drum rum machen. Auch wenn die Auswirkungen bei mir jetzt ungewöhnlich sind, werden Error in asynchronen Funktionen nicht abgefangen und werden immer den Javascript-Adapter anhalten.
Wenn der timeout z.B. abläuft kommt ein Error und den mußt du behandeln.
-
@ticaki ok. Verstehe trotzdem nicht, warum es nicht geht.
-
@ben1983
Mach deine Bespiele bitte einfacherconst test = { status: 'das geht', neee: () => this.status } log(test.neee()) class test2 { status = 'das geht' neee = () => this.status constructor() {}; } const testc = new test2(); log(testc.neee())
Ich bin mit scope jetzt nicht so firm, aber ein Json hat doch kein this oder? EDIT: ok this hat es das scheint aber nur bei Konstanten zu funktionieren.
13:28:20.430 info javascript.0 (651) Start javascript script.js.Test.Skript_122 13:28:20.433 info javascript.0 (651) script.js.Test.Skript_122: undefined 13:28:20.433 info javascript.0 (651) script.js.Test.Skript_122: das geht
-
Ich scheine es gefunden zu haben.
Es war wieder mal, dass ich true oder false zurückgegeben habe, kein Objekt.so geht es (Haben ein Objekt mit result zurückgegeben)
const automatikfreigabe = { beleuchtung: { aktiv: false, bypass: false, checkRelease: async function(kinderSindDa){ try{ //Zeit in Bereich zuweisen const timeOK = await messageToAsync("TimeAfterOrEqualNow",{time:this.zeitAbendsWennKinderDa},{timeout:5000}); return {result:(this.aktiv && // Entweder der Bypass ist gesetzt (this.bypass || // Oder der Zustand wurde schon gesetzt (this.zustand && (!kinderSindDa || timeOK.result))))}; } catch(error){ log(error); } }, } } async function test(){ log("start") try{ if(await automatikfreigabe.beleuchtung.checkRelease(true)){ log("Mitte") } } catch(error){ log(error); } log("Ende"); }; test();
-
@ben1983
Ich vermute viel eher das das ergebnis vorher undefinied war und damit false, jetzt ist es ein Object und damit true. -
@ticaki ok. Verstehe trotzdem nicht, warum es nicht geht.
Nein, denn ein direkter log der Ergebnisses nach dem Aufruf führte zu nichts.
Naja jetzt geht es jedefalls -
@ben1983
Naja wenns geht gut, ich hätte es mit Klassen für Funktionen und Json für Konstanten gelöst -
@ticaki ???? Wie meinst Du das?
-
@ben1983
Ist schlecht ein Beispiel zu erstellen, da der Vorteil ja erst bei Gemeinsamkeiten zum Tragen kommt aber sowas z.B.:// 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 }); } }); const automatikfreigabe={ beleuchtung: { aktiv: idAutomatikfreigabeBeleuchtungAktiv, bypass: idAutomatikfreigabeBeleuchtungBypass, zustand: idAutomatikfreigabeBeleuchtungZustand, kinderSindDa: idAutomatikfreigabeBeleuchtungKidnerSindDa, zeitAbendsWennKinderDa: gidAutomatikfreigabeBeleuchtungZeitAbendsWennKinderDaSind, }, } var beleuchtung=null; class Beleuchtung { options={}; dpOptions = {}; // kein async für constructor möglich constructor(options) { for (const a in options) { if (options[a]) this.dpOptions[a]=options[a]; } } async updateDp() { for (const a in this.dpOptions[a]) { this.options[a]=getState(this.dpOptions[a]).val; } } async checkRelease(kinderSindDa) { // Es muss die Automatikfreigabe aktiv sein try { const result=this.options.aktiv&& // Entweder der Bypass ist gesetzt (this.options.bypass|| // Oder der Zustand wurde schon gesetzt (this.options.zustand&& (!kinderSindDa||(await messageToAsync("TimeAfterOrEqualNow",{ time: "21:30" },{ timeout: 5000 })).result))); } catch (e) { log(e) result={}; } return result; } } async function main() { beleuchtung=new Beleuchtung(automatikfreigabe.beleuchtung); await beleuchtung.updateDp() log(JSON.stringify(await beleuchtung.checkRelease(true))); }
habs auch nicht getestet, ist mehr ein "Muster"
-
@ticaki ok.
Erkenne jetzt nicht grad ein Vorteil, aber ok -
@ben1983
Glaube nicht das json oder klassen pauschal einen Vorteil haben. Hängt von den Umständen ab und persönlichen Vorlieben. -
@ticaki ok. Aber ist das Objekt bei mir kein JSON? Ist doch das gleiche, oder übersehe ich was? Ist halt nur noch die Funktion direkt drin.
-
@ben1983
Du benutzt ein Json. Ich wollte damit sagen das weder deine Art, noch meine Art nicht pauschal besser sind.