Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Asynchrone Funktionen innerhalb eine Subscribtion aufrufen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Asynchrone Funktionen innerhalb eine Subscribtion aufrufen

    This topic has been deleted. Only users with topic management privileges can see it.
    • T
      ticaki Developer @Ben1983 last edited by ticaki

      @ben1983

      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.

      1 Reply Last reply Reply Quote 0
      • T
        ticaki Developer @Ben1983 last edited by

        @ben1983

        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.

        Ben1983 1 Reply Last reply Reply Quote 0
        • Ben1983
          Ben1983 @ticaki last edited by

          @ticaki ok. Verstehe trotzdem nicht, warum es nicht geht.

          T 1 Reply Last reply Reply Quote 0
          • T
            ticaki Developer @Ben1983 last edited by ticaki

            @ben1983
            Mach deine Bespiele bitte einfacher 🙂

            const 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
            
            Ben1983 1 Reply Last reply Reply Quote 0
            • Ben1983
              Ben1983 @ticaki last edited by

              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();
              
              
              
              
              
              
              
              
              
              
              
              
              T 1 Reply Last reply Reply Quote 0
              • T
                ticaki Developer @Ben1983 last edited by ticaki

                @ben1983
                Ich vermute viel eher das das ergebnis vorher undefinied war und damit false, jetzt ist es ein Object und damit true.

                Ben1983 1 Reply Last reply Reply Quote 0
                • Ben1983
                  Ben1983 @ticaki last edited by

                  @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

                  T 1 Reply Last reply Reply Quote 0
                  • T
                    ticaki Developer @Ben1983 last edited by

                    @ben1983
                    Naja wenns geht gut, ich hätte es mit Klassen für Funktionen und Json für Konstanten gelöst 🙂

                    Ben1983 1 Reply Last reply Reply Quote 0
                    • Ben1983
                      Ben1983 @ticaki last edited by

                      @ticaki ???? Wie meinst Du das?

                      T 1 Reply Last reply Reply Quote 0
                      • T
                        ticaki Developer @Ben1983 last edited by ticaki

                        @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"

                        Ben1983 1 Reply Last reply Reply Quote 0
                        • Ben1983
                          Ben1983 @ticaki last edited by

                          @ticaki ok.
                          Erkenne jetzt nicht grad ein Vorteil, aber ok

                          T 1 Reply Last reply Reply Quote 0
                          • T
                            ticaki Developer @Ben1983 last edited by ticaki

                            @ben1983
                            Glaube nicht das json oder klassen pauschal einen Vorteil haben. Hängt von den Umständen ab und persönlichen Vorlieben.

                            Ben1983 1 Reply Last reply Reply Quote 0
                            • Ben1983
                              Ben1983 @ticaki last edited by

                              @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.

                              T 1 Reply Last reply Reply Quote 0
                              • T
                                ticaki Developer @Ben1983 last edited by

                                @ben1983
                                Du benutzt ein Json. Ich wollte damit sagen das weder deine Art, noch meine Art nicht pauschal besser sind.

                                1 Reply Last reply Reply Quote 0
                                • First post
                                  Last post

                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                847
                                Online

                                31.9k
                                Users

                                80.1k
                                Topics

                                1.3m
                                Posts

                                2
                                22
                                634
                                Loading More Posts
                                • Oldest to Newest
                                • Newest to Oldest
                                • Most Votes
                                Reply
                                • Reply as topic
                                Log in to reply
                                Community
                                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                The ioBroker Community 2014-2023
                                logo