NEWS
Asynchrone Funktionen innerhalb eine Subscribtion aufrufen
-
@ben1983 Hallo,
ich habe noch ein "Problem" folgender Code:
const automatikfreigabe = { beleuchtung: { zeitAbendsWennKindeDa: getState(idAutomatikfreigabeBeleuchtungZeitAbendsWennKindeDa).val, checkRelease: async function(kinderSindDa){ return kinderSindDa && (await messageToAsync("TimeBeforeOrEqualNow",{time:this.zeitAbendsWennKindeDa},{timeout:5000})).result; } } }
dann:
$(`state(${enumtypeFunctions}=${enumBewegungsmelder})(${enumtypeRooms}=${enumTreppenhaus})$`).on(async (obj)=>{ const result = await automatikfreigabe.beleuchtung.checkRelease(true); log(JSON.stringify(result));
ich bekomme schon nichts als result zurück, also es wird nichts geloggt.
Muss ich oben in dem Teil das dann anderes handhaben mit dem return?
Muss ich das auch alles in Promisses umbauen?Habe esjetzt erst mal Synchron mit einer eigenen function im skript gelöst
-
@ben1983 sagte in Asynchrone Funktionen innerhalb eine Subscribtion aufrufen:
Hab natürlich nicht deine States, jedoch das hier geht bei mir wie erwartet:
async function work() { const automatikfreigabe={ beleuchtung: { zeitAbendsWennKindeDa: "10:15:10", checkRelease: async function (kinderSindDa) { return kinderSindDa&&(await messageToAsync("TimeBeforeOrEqualNow",{ time: this.zeitAbendsWennKindeDa },{ timeout: 5000 })).result; } } } // 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()}T${messagedata.time}`); log(inputTime); if (inputTime) { callback({ result: inputTime<=now }); } else { callback({ result: false }); } }); log("Start"); const result=await automatikfreigabe.beleuchtung.checkRelease(true); log(JSON.stringify(result)); log("Ende"); } work()
Hab in der Inputzeit ein T eingefügt.
Die könnte man noch so anpassen:
// messagedata.time = 10:12 const inputTime=new Date(`${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}T${messagedata.time}:00`);
-
@ticaki Also bei mir kommt da nur der log:
Start Ende
raus. den result logt er gar nicht.
Als wäre er nicht da. -
Hast du meinen Code genommen und diesen ausprobiert oder ist das mit deinem Code gewesen?
10:17:59.554 info javascript.0 (9472) Start javascript script.js.Test.Skript_122 10:17:59.557 info javascript.0 (9472) script.js.Test.Skript_122: Start 10:17:59.557 info javascript.0 (9472) script.js.Test.Skript_122: registered 0 subscriptions, 0 schedules, 1 message, 0 logs and 0 file subscriptions 10:17:59.561 info javascript.0 (9472) script.js.Test.Skript_122: Fri Nov 10 2023 10:15:10 GMT+0100 (Mitteleuropäische Normalzeit) 10:17:59.562 info javascript.0 (9472) script.js.Test.Skript_122: true 10:17:59.562 info javascript.0 (9472) script.js.Test.Skript_122: Ende
EDIT: Ich vermute da das Problem eher in dem
$(`state(${enumtypeFunctions}=${enumBewegungsmelder})(${enumtypeRooms}=${enumTreppenhaus})$`).on
EDIT2: wofür ist das $ am Ende - kenne ich so nicht.
$('state(functions=sensor)(functions=window)')
-
@ticaki ALso ich denke es liegt irgendwie hier:
const automatikfreigabe = { beleuchtung: { aktiv: getState(idAutomatikfreigabeBeleuchtungAktiv).val, bypass: getState(idAutomatikfreigabeBeleuchtungBypass).val, zustand: getState(idAutomatikfreigabeBeleuchtungZustand).val, kinderSindDa : getState(idAutomatikfreigabeBeleuchtungKidnerSindDa).val, zeitAbendsWennKinderDa: getState(idAutomatikfreigabeBeleuchtungZeitAbendsWennKinderDaSind).val, checkRelease: async function(kinderSindDa){ // Es muss die Automatikfreigabe aktiv sein return this.aktiv && // Entweder der Bypass ist gesetzt (this.bypass || // Oder der Zustand wurde schon gesetzt (this.zustand && (!kinderSindDa || (await messageToAsync("TimeAfterOrEqualNow",{time:"21:30"},{timeout:5000})).result))); }, functionstest: async function(){ return (await messageToAsync("TimeAfterOrEqualNow",{time:"21:30"},{timeout:5000})).result; }
denn ein einfacher Test
async function test(){ log("start") if(await automatikfreigabe.beleuchtung.checkRelease(true)){ log("Mitte") } log("Ende"); }; test();
funktioniert nicht, jedoch mit der Testfunktion schon
async function test(){ log("start") if(await automatikfreigabe.beleuchtung.testfunktion()){ log("Mitte") } log("Ende"); }; test();
Selbst mit der Änderung
checkRelease: async function(kinderSindDa){ //Zeit in Bereich zuweisen const timeOK = await messageToAsync("TimeAfterOrEqualNow",{time:this.zeitAbendsWennKinderDa},{timeout:5000}); // Es muss die Automatikfreigabe aktiv sein return this.aktiv && // Entweder der Bypass ist gesetzt (this.bypass || // Oder der Zustand wurde schon gesetzt (this.zustand && (!kinderSindDa || timeOK.result))); }
gehts bei mir nicht
Ich muss erst mal weg.... versuche später nochmal ein einfaches beispiel zu generieren, wie es geht und wie nicht.
Habe irhendwie das Gefühl, sobald Abfrage im Script sind, gehts nicht.denn ein
checkRelease: async function(kinderSindDa){ return (await messageToAsync("TimeAfterOrEqualNow",{time:this.zeitAbendsWennKinderDa},{timeout:5000})).result; }
funktioniert
-
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.