Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

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

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.2k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.2k

js callback asynchron problem

Scheduled Pinned Locked Moved JavaScript
16 Posts 5 Posters 1.0k Views 6 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • hanssH Offline
    hanssH Offline
    hanss
    wrote on last edited by
    #1

    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 1 Reply Last reply
    0
    • 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
      wrote on last edited by
      #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 Reply Last reply
      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
        wrote on last edited by
        #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 Reply Last reply
        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
          wrote on last edited by
          #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 Reply Last reply
          0
          • AlCalzoneA Offline
            AlCalzoneA Offline
            AlCalzone
            Developer
            wrote on last edited by 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 Replies Last reply
            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
              wrote on last edited by 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 Replies Last reply
              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
                wrote on last edited by
                #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 Reply Last reply
                1
                • AlCalzoneA AlCalzone

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

                  liv-in-skyL Offline
                  liv-in-skyL Offline
                  liv-in-sky
                  wrote on last edited by
                  #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 Reply Last reply
                  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
                    wrote on last edited by
                    #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 Reply Last reply
                    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
                      wrote on last edited by
                      #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 Reply Last reply
                      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
                        wrote on last edited by
                        #11

                        @liv-in-sky cool, Danke!

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

                        1 Reply Last reply
                        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
                          wrote on last edited by
                          #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 Replies Last reply
                          0
                          • OliverIOO OliverIO

                            @AlCalzone

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

                            OliverIOO Offline
                            OliverIOO Offline
                            OliverIO
                            wrote on last edited by 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 Reply Last reply
                            0
                            • OliverIOO OliverIO

                              @AlCalzone

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

                              hanssH Offline
                              hanssH Offline
                              hanss
                              wrote on last edited by
                              #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 Reply Last reply
                              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
                                wrote on last edited by 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 Reply Last reply
                                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
                                  wrote on last edited by
                                  #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 Reply Last reply
                                  0
                                  Reply
                                  • Reply as topic
                                  Log in to reply
                                  • Oldest to Newest
                                  • Newest to Oldest
                                  • Most Votes


                                  Support us

                                  ioBroker
                                  Community Adapters
                                  Donate

                                  286

                                  Online

                                  32.4k

                                  Users

                                  81.4k

                                  Topics

                                  1.3m

                                  Posts
                                  Community
                                  Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                  ioBroker Community 2014-2025
                                  logo
                                  • Login

                                  • Don't have an account? Register

                                  • Login or register to search.
                                  • First post
                                    Last post
                                  0
                                  • Home
                                  • Recent
                                  • Tags
                                  • Unread 0
                                  • Categories
                                  • Unreplied
                                  • Popular
                                  • GitHub
                                  • Docu
                                  • Hilfe