Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. js callback asynchron problem

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    15
    1
    647

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    632

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    1.9k

js callback asynchron problem

Geplant Angeheftet Gesperrt Verschoben JavaScript
16 Beiträge 5 Kommentatoren 1.2k Aufrufe 6 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • hanssH hanss

    Hallo,
    ich komme seit Tagen mit diesem Problem nicht weiter.
    Asynchrone Programmierung ist wohl nicht meine Welt.

    var Raumctr = 0
    // Schleife für jeden Raum ######################################
     S_Raum.forEach(function(element, index) { 
            if( SollTemp_akt != Temp_FOA && SollTemp_akt != Temp_Abw ){    
                setState(Out_Root+D_Raum[index]+".Man",SollTemp_akt,true,function(){
                           setRT(index,element,SollTemp_akt)         // function setRT wg. Callback
                           log("RaumzählerCB: "+Raumctr+" Index: "+RaumIndex) 
                })
            } else {
                setRT(index,element,SollTemp_akt)
                log("Raumzähler: "+Raumctr+" Index: "+RaumIndex) 
            }
       }); 
     // Schleife für jeden Raum ######################################
     
    // Script hier, wenn alle Räume durchlaufen sind
    // ##########   Script soll hier fortfahren, wenn  Schleife für jeden Raum durchlaufen ist.  ##########
    log("Raumzähler nach allen Räumen: "+Raumctr+" Index: "+RaumIndex)
    
    Monitor:
    // wegen dem verzögerten Callback wird folgende Reihenfolge ausgegeben:
    Raumzähler: 1 Index: 4
    Raumzähler: 2 Index: 5
    Raumzähler: 3 Index: 6
    Raumzähler: 4 Index: 7
    Raumzähler nach allen Räumen: 4 Index: 7  - zu früh, im Callback warten noch 4 Räume
    RaumzählerCB: 5 Index: 0
    RaumzählerCB: 6 Index: 1
    RaumzählerCB: 7 Index: 2
    RaumzählerCB: 8 Index: 3
    
      
     function setRT(index,element,SollTemp_akt){
                    Raumctr++
                    RaumIndex = index
     }
    

    Das Problem dabei:
    je nach "if( SollTemp_akt != Temp_FOA && SollTemp_akt != Temp_Abw )" wird die funktion setRT()
    einmal direkt oder als callback aufgerufen.

    "// Script hier, wenn alle Räume durchlaufen sind"
    soll aber in jedem Fall erst ausgeführt werden, wenn alle Räume durchlaufen sind.
    In dem Beispiel hier wird zuerst die setRT() als Callback aufgerufen, wegen der Verzögerung bei
    setState wird der Raumctr aber erst incrementiert, nachdem der anschließende direkte Aufruf von setRT()
    schon beendet ist und die Schleife für jeden Raum schon beendet wurde.

    OliverIOO Offline
    OliverIOO Offline
    OliverIO
    schrieb am zuletzt editiert von
    #2

    @hanss
    du könntest den Aufruf des 2.setRT ebenfalls in einen Callback mit settimeout setzen, dann werden die Aufrufe zumindes in gleicher Reihenfolge auf den Stack geschrieben.
    Allerdings kann die Abarbeitung innerhalb des Callbacks unterschiedlich lange ausfallen. Von daher hast du keine Garantie, das hier genau die gleiche Reihenfolge eingehalten wird

    setTimeout(function(){
                setRT(index,element,SollTemp_akt)
                log("Raumzähler: "+Raumctr+" Index: "+RaumIndex) 
    },10);
    

    kann man in den Skripten setState nicht auch synchron aufrufen?

    Meine Adapter und Widgets
    TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
    Links im Profil

    hanssH 1 Antwort Letzte Antwort
    0
    • OliverIOO OliverIO

      @hanss
      du könntest den Aufruf des 2.setRT ebenfalls in einen Callback mit settimeout setzen, dann werden die Aufrufe zumindes in gleicher Reihenfolge auf den Stack geschrieben.
      Allerdings kann die Abarbeitung innerhalb des Callbacks unterschiedlich lange ausfallen. Von daher hast du keine Garantie, das hier genau die gleiche Reihenfolge eingehalten wird

      setTimeout(function(){
                  setRT(index,element,SollTemp_akt)
                  log("Raumzähler: "+Raumctr+" Index: "+RaumIndex) 
      },10);
      

      kann man in den Skripten setState nicht auch synchron aufrufen?

      hanssH Offline
      hanssH Offline
      hanss
      schrieb am zuletzt editiert von
      #3

      @OliverIO
      Vielen Dank, aber Deine Lösung ist nicht sicher, weil zeitabhängig.
      Ein synchroner setState wäre die Lösung, das hätte mir zwei Tage rumprobieren erspart.

      OliverIOO 1 Antwort Letzte Antwort
      0
      • hanssH hanss

        @OliverIO
        Vielen Dank, aber Deine Lösung ist nicht sicher, weil zeitabhängig.
        Ein synchroner setState wäre die Lösung, das hätte mir zwei Tage rumprobieren erspart.

        OliverIOO Offline
        OliverIOO Offline
        OliverIO
        schrieb am zuletzt editiert von
        #4

        @hanss wie gesagt bei asynchron gibt es keine garantierte abfolge.

        evtl beschreibst du mal was du am ende erreichen möchtest, evtl ist dein bisheriger lösungsweg nicht optimal

        Meine Adapter und Widgets
        TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
        Links im Profil

        1 Antwort Letzte Antwort
        0
        • AlCalzoneA Offline
          AlCalzoneA Offline
          AlCalzone
          Developer
          schrieb am zuletzt editiert von AlCalzone
          #5

          Eventuell sind die neuen async-Funktionen in 4.8.x was für dich @hanss
          https://forum.iobroker.net/topic/36999/neu-diverse-async-funktionen-im-javascript-adapter

          Damit lässt sich der Programmablauf trotz asynchronität schön steuern. Ich hab den obigen Schnipsel mal entsprechend umgebaut. Beachte das async vor der Funktion und await setStateAsync:

          async function raumzaehler() {
          	var Raumctr = 0;
          
          	// Schleife für jeden Raum ######################################
          	for (let i = 0; i < S_Raum.length; i++) {
          		const element = S_Raum[i];
          		if (SollTemp_akt != Temp_FOA && SollTemp_akt != Temp_Abw) {
          			await setStateAsync(Out_Root + D_Raum[index] + ".Man", SollTemp_akt, true);
          			setRT(index, element, SollTemp_akt); // function setRT wg. Callback
          			log("RaumzählerCB: " + Raumctr + " Index: " + RaumIndex);
          		} else {
          			setRT(index, element, SollTemp_akt);
          			log("Raumzähler: " + Raumctr + " Index: " + RaumIndex);
          		}
          	}
          	// Schleife für jeden Raum ######################################
          
          	// ##########   Script soll hier fortfahren, wenn  Schleife für jeden Raum durchlaufen ist.  ##########
          	log("Raumzähler nach allen Räumen: " + Raumctr + " Index: " + RaumIndex);
          
          }
          
          // Funktion aufrufen nicht vergessen!
          raumzaehler();
          

          Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

          liv-in-skyL OliverIOO 2 Antworten Letzte Antwort
          0
          • AlCalzoneA AlCalzone

            Eventuell sind die neuen async-Funktionen in 4.8.x was für dich @hanss
            https://forum.iobroker.net/topic/36999/neu-diverse-async-funktionen-im-javascript-adapter

            Damit lässt sich der Programmablauf trotz asynchronität schön steuern. Ich hab den obigen Schnipsel mal entsprechend umgebaut. Beachte das async vor der Funktion und await setStateAsync:

            async function raumzaehler() {
            	var Raumctr = 0;
            
            	// Schleife für jeden Raum ######################################
            	for (let i = 0; i < S_Raum.length; i++) {
            		const element = S_Raum[i];
            		if (SollTemp_akt != Temp_FOA && SollTemp_akt != Temp_Abw) {
            			await setStateAsync(Out_Root + D_Raum[index] + ".Man", SollTemp_akt, true);
            			setRT(index, element, SollTemp_akt); // function setRT wg. Callback
            			log("RaumzählerCB: " + Raumctr + " Index: " + RaumIndex);
            		} else {
            			setRT(index, element, SollTemp_akt);
            			log("Raumzähler: " + Raumctr + " Index: " + RaumIndex);
            		}
            	}
            	// Schleife für jeden Raum ######################################
            
            	// ##########   Script soll hier fortfahren, wenn  Schleife für jeden Raum durchlaufen ist.  ##########
            	log("Raumzähler nach allen Räumen: " + Raumctr + " Index: " + RaumIndex);
            
            }
            
            // Funktion aufrufen nicht vergessen!
            raumzaehler();
            
            liv-in-skyL Offline
            liv-in-skyL Offline
            liv-in-sky
            schrieb am zuletzt editiert von liv-in-sky
            #6

            @AlCalzone

            ich habe immer wieder probleme mit dem async und await - toll wäre es, wenn man so was wie mit dem type-script kurs für adapterentwickler machen würde - nur halt für dieses thema

            nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

            AlCalzoneA F 2 Antworten Letzte Antwort
            0
            • liv-in-skyL liv-in-sky

              @AlCalzone

              ich habe immer wieder probleme mit dem async und await - toll wäre es, wenn man so was wie mit dem type-script kurs für adapterentwickler machen würde - nur halt für dieses thema

              AlCalzoneA Offline
              AlCalzoneA Offline
              AlCalzone
              Developer
              schrieb am zuletzt editiert von
              #7

              @liv-in-sky https://gist.github.com/AlCalzone/d14b854b69ce5e8a03718336cc650a95
              😎

              Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

              liv-in-skyL 1 Antwort Letzte Antwort
              1
              • AlCalzoneA AlCalzone

                @liv-in-sky https://gist.github.com/AlCalzone/d14b854b69ce5e8a03718336cc650a95
                😎

                liv-in-skyL Offline
                liv-in-skyL Offline
                liv-in-sky
                schrieb am zuletzt editiert von
                #8

                @AlCalzone danke werd ich mal durcharbeiten

                nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                1 Antwort Letzte Antwort
                0
                • liv-in-skyL liv-in-sky

                  @AlCalzone

                  ich habe immer wieder probleme mit dem async und await - toll wäre es, wenn man so was wie mit dem type-script kurs für adapterentwickler machen würde - nur halt für dieses thema

                  F Offline
                  F Offline
                  fastfoot
                  schrieb am zuletzt editiert von
                  #9

                  @liv-in-sky sagte in js callback asynchron problem:

                  ....wenn man so was wie mit dem type-script kurs für adapterentwickler machen würde....

                  gibt es dazu einen Link?

                  iobroker läuft unter Docker auf QNAP TS-451+
                  SkriptRecovery: https://forum.iobroker.net/post/930558

                  liv-in-skyL 1 Antwort Letzte Antwort
                  0
                  • F fastfoot

                    @liv-in-sky sagte in js callback asynchron problem:

                    ....wenn man so was wie mit dem type-script kurs für adapterentwickler machen würde....

                    gibt es dazu einen Link?

                    liv-in-skyL Offline
                    liv-in-skyL Offline
                    liv-in-sky
                    schrieb am zuletzt editiert von
                    #10

                    @fastfoot

                    https://forum.iobroker.net/topic/36493/09-09-20-30-einsteiger-cursus-demonstration-von-typescript

                    nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

                    F 1 Antwort Letzte Antwort
                    1
                    • liv-in-skyL liv-in-sky

                      @fastfoot

                      https://forum.iobroker.net/topic/36493/09-09-20-30-einsteiger-cursus-demonstration-von-typescript

                      F Offline
                      F Offline
                      fastfoot
                      schrieb am zuletzt editiert von
                      #11

                      @liv-in-sky cool, Danke!

                      iobroker läuft unter Docker auf QNAP TS-451+
                      SkriptRecovery: https://forum.iobroker.net/post/930558

                      1 Antwort Letzte Antwort
                      0
                      • AlCalzoneA AlCalzone

                        Eventuell sind die neuen async-Funktionen in 4.8.x was für dich @hanss
                        https://forum.iobroker.net/topic/36999/neu-diverse-async-funktionen-im-javascript-adapter

                        Damit lässt sich der Programmablauf trotz asynchronität schön steuern. Ich hab den obigen Schnipsel mal entsprechend umgebaut. Beachte das async vor der Funktion und await setStateAsync:

                        async function raumzaehler() {
                        	var Raumctr = 0;
                        
                        	// Schleife für jeden Raum ######################################
                        	for (let i = 0; i < S_Raum.length; i++) {
                        		const element = S_Raum[i];
                        		if (SollTemp_akt != Temp_FOA && SollTemp_akt != Temp_Abw) {
                        			await setStateAsync(Out_Root + D_Raum[index] + ".Man", SollTemp_akt, true);
                        			setRT(index, element, SollTemp_akt); // function setRT wg. Callback
                        			log("RaumzählerCB: " + Raumctr + " Index: " + RaumIndex);
                        		} else {
                        			setRT(index, element, SollTemp_akt);
                        			log("Raumzähler: " + Raumctr + " Index: " + RaumIndex);
                        		}
                        	}
                        	// Schleife für jeden Raum ######################################
                        
                        	// ##########   Script soll hier fortfahren, wenn  Schleife für jeden Raum durchlaufen ist.  ##########
                        	log("Raumzähler nach allen Räumen: " + Raumctr + " Index: " + RaumIndex);
                        
                        }
                        
                        // Funktion aufrufen nicht vergessen!
                        raumzaehler();
                        
                        OliverIOO Offline
                        OliverIOO Offline
                        OliverIO
                        schrieb am zuletzt editiert von
                        #12

                        @AlCalzone

                        Async und await machen aus asynchronen Funktionen wieder synchrone Funktionen.
                        Das will er ja nicht

                        Meine Adapter und Widgets
                        TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                        Links im Profil

                        OliverIOO hanssH AlCalzoneA 3 Antworten Letzte Antwort
                        0
                        • OliverIOO OliverIO

                          @AlCalzone

                          Async und await machen aus asynchronen Funktionen wieder synchrone Funktionen.
                          Das will er ja nicht

                          OliverIOO Offline
                          OliverIOO Offline
                          OliverIO
                          schrieb am zuletzt editiert von OliverIO
                          #13

                          Hier mal ein kurzer Artikel, der auf einen Punkt eingeht, der die Funktionsweise der asynchronen Funktionen (callback oder auch promise basiert) erklärt

                          https://dev.to/steelvoltage/if-javascript-is-single-threaded-how-is-it-asynchronous-56gd

                          Meine Adapter und Widgets
                          TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                          Links im Profil

                          1 Antwort Letzte Antwort
                          0
                          • OliverIOO OliverIO

                            @AlCalzone

                            Async und await machen aus asynchronen Funktionen wieder synchrone Funktionen.
                            Das will er ja nicht

                            hanssH Offline
                            hanssH Offline
                            hanss
                            schrieb am zuletzt editiert von
                            #14

                            @OliverIO
                            Vielen Dank, ich habe das jetzt so gelöst:

                            In die Funktion setRT() einen Raumzähler und das Script eingefügt, wenn alle Räume durchlaufen sind:
                            Das ist sehr übersichtlich und nicht so kompliziert wie async und await.
                            Ich glaube, das kapier ich nicht mehr.

                            setRT() {
                              Raumctr++
                              //mein Script
                            
                               if (S_Raum.length == Raumctr){              // letzter Raum
                                   // Script hier, wenn alle Räume durchlaufen sind 
                                   Raumctr=0        
                               }
                            }
                            
                            1 Antwort Letzte Antwort
                            0
                            • OliverIOO OliverIO

                              @AlCalzone

                              Async und await machen aus asynchronen Funktionen wieder synchrone Funktionen.
                              Das will er ja nicht

                              AlCalzoneA Offline
                              AlCalzoneA Offline
                              AlCalzone
                              Developer
                              schrieb am zuletzt editiert von AlCalzone
                              #15

                              @OliverIO wieso nicht? Wenn man etwas ausführen will, nachdem asynchrone Vorgänge durch sind, ist async/await genau das richtige Mittel.
                              Und IMO intuitiver als der callback Krempel. Nach dem Aufruf mit await ist es einfach fertig.

                              Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

                              OliverIOO 1 Antwort Letzte Antwort
                              0
                              • AlCalzoneA AlCalzone

                                @OliverIO wieso nicht? Wenn man etwas ausführen will, nachdem asynchrone Vorgänge durch sind, ist async/await genau das richtige Mittel.
                                Und IMO intuitiver als der callback Krempel. Nach dem Aufruf mit await ist es einfach fertig.

                                OliverIOO Offline
                                OliverIOO Offline
                                OliverIO
                                schrieb am zuletzt editiert von
                                #16

                                @AlCalzone
                                Ah hatte einer seiner Antworten falsch interpretiert. Hab nochmal gelesen.
                                Wenn er mit seiner Lösung nun zufrieden ist, ist ja alles gut

                                Meine Adapter und Widgets
                                TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                                Links im Profil

                                1 Antwort Letzte Antwort
                                0
                                Antworten
                                • In einem neuen Thema antworten
                                Anmelden zum Antworten
                                • Älteste zuerst
                                • Neuste zuerst
                                • Meiste Stimmen


                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                918

                                Online

                                32.6k

                                Benutzer

                                81.9k

                                Themen

                                1.3m

                                Beiträge
                                Community
                                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                ioBroker Community 2014-2025
                                logo
                                • Anmelden

                                • Du hast noch kein Konto? Registrieren

                                • Anmelden oder registrieren, um zu suchen
                                • Erster Beitrag
                                  Letzter Beitrag
                                0
                                • Home
                                • Aktuell
                                • Tags
                                • Ungelesen 0
                                • Kategorien
                                • Unreplied
                                • Beliebt
                                • GitHub
                                • Docu
                                • Hilfe