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. async / await - Verständnisfrage

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.4k

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

async / await - Verständnisfrage

Geplant Angeheftet Gesperrt Verschoben JavaScript
5 Beiträge 4 Kommentatoren 226 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.
  • bahnuhrB Online
    bahnuhrB Online
    bahnuhr
    Forum Testing Most Active
    schrieb am zuletzt editiert von bahnuhr
    #1

    Guten Morgen,

    bisher dachte ich, wenn man await einsetzt, dass dann gewartet wird bis der Befehl "erledigt" ist.

    Folgendes (gekürzt und vereinfacht) Script:

    // wenn ...Ansage auf true dann mp3 kopieren und Text ansagen
        on({id: "javascript.0.Geräte.Yamaha.Ansage", change: "any", val: true}, function() {  
    	...
            Beginn();
        });
    
    // Beginn
        async function Beginn() {
    	...
            await power();  
            await input_lautstaerke();
            await Dateien();
            await pruef_Verzeichnis(0);
        }
    
    // power on 
        async function power() {
            await request(yamaha + 'main/setPower?power=on', function (error, response, body) {
                if (!error && response.statusCode == 200) { if (logging) log('power: ' + yamaha_IP + '; Power eingeschaltet');  } else {    log("power: Error: MusicCast = " + error);  }
            });
        }
    
    // Input_Lautstärke setzen
        async function input_lautstaerke() {
            ....
        }
    
    // Dateien kopieren
        async function Dateien() {
                await Datei_kopieren ...
                await request ....
        }
    
    // Verzeichnis prüfen
        async function pruef_Verzeichnis(index) {
            await request ....(yamaha + 'netusb/getListInfo?input=server&index=' + index + '"&size=8&lang=de', function (error, response, body) {
                if (!error && response.statusCode == 200) {
                    .....
    		.....
                    .....
    		.....
                    setzen_Verzeichnis(Nr); 
                    .....
    		.....
                    play_Datei(); 
            });
        }
    
    // Verzeichnis setzen
        async function setzen_Verzeichnis(index) {
            	await request.....
    		.....
                    .....
                    pruef_Verzeichnis(0);
                });
        }
    
    // Datei abspielen
        async function play_Datei() {
            log ("hier3");
            await request......
        }
    
    

    Nach meinem Verständnis müsste doch das log ganz unten:
    log ("hier3");
    zum Schluss kommen.
    Es kommt aber schon vorher.

    In den Funktionen "pruef_Verzeichnis" und "setzen_Verzeichnis" springt er immer hin und her, bevor letztendlich das richtige Verzeichnis erreicht ist. Erst dann geht es zu "play_Datei".

    Frage:
    Wie macht man es richtig ?

    P.S.:
    Ich kann auch gerne das komplette Script zur Verfügung stellen.


    Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
    Danke.
    gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
    ScreenToGif :https://www.screentogif.com/downloads.html

    ? liv-in-skyL 3 Antworten Letzte Antwort
    0
    • bahnuhrB bahnuhr

      Guten Morgen,

      bisher dachte ich, wenn man await einsetzt, dass dann gewartet wird bis der Befehl "erledigt" ist.

      Folgendes (gekürzt und vereinfacht) Script:

      // wenn ...Ansage auf true dann mp3 kopieren und Text ansagen
          on({id: "javascript.0.Geräte.Yamaha.Ansage", change: "any", val: true}, function() {  
      	...
              Beginn();
          });
      
      // Beginn
          async function Beginn() {
      	...
              await power();  
              await input_lautstaerke();
              await Dateien();
              await pruef_Verzeichnis(0);
          }
      
      // power on 
          async function power() {
              await request(yamaha + 'main/setPower?power=on', function (error, response, body) {
                  if (!error && response.statusCode == 200) { if (logging) log('power: ' + yamaha_IP + '; Power eingeschaltet');  } else {    log("power: Error: MusicCast = " + error);  }
              });
          }
      
      // Input_Lautstärke setzen
          async function input_lautstaerke() {
              ....
          }
      
      // Dateien kopieren
          async function Dateien() {
                  await Datei_kopieren ...
                  await request ....
          }
      
      // Verzeichnis prüfen
          async function pruef_Verzeichnis(index) {
              await request ....(yamaha + 'netusb/getListInfo?input=server&index=' + index + '"&size=8&lang=de', function (error, response, body) {
                  if (!error && response.statusCode == 200) {
                      .....
      		.....
                      .....
      		.....
                      setzen_Verzeichnis(Nr); 
                      .....
      		.....
                      play_Datei(); 
              });
          }
      
      // Verzeichnis setzen
          async function setzen_Verzeichnis(index) {
              	await request.....
      		.....
                      .....
                      pruef_Verzeichnis(0);
                  });
          }
      
      // Datei abspielen
          async function play_Datei() {
              log ("hier3");
              await request......
          }
      
      

      Nach meinem Verständnis müsste doch das log ganz unten:
      log ("hier3");
      zum Schluss kommen.
      Es kommt aber schon vorher.

      In den Funktionen "pruef_Verzeichnis" und "setzen_Verzeichnis" springt er immer hin und her, bevor letztendlich das richtige Verzeichnis erreicht ist. Erst dann geht es zu "play_Datei".

      Frage:
      Wie macht man es richtig ?

      P.S.:
      Ich kann auch gerne das komplette Script zur Verfügung stellen.

      ? Offline
      ? Offline
      Ein ehemaliger Benutzer
      schrieb am zuletzt editiert von
      #2

      @bahnuhr hmm wenn dann musst du schon alle Funktionen mit async und await deklarieren und nicht teils/teils. Mach mal die on funktion auch zum async function und dann await beginn(). Und den rest dann auch durchgucken ob alles richtig deklariert ist mit async und await. Vielleicht behebt es das problem schon. :)

      1 Antwort Letzte Antwort
      0
      • bahnuhrB bahnuhr

        Guten Morgen,

        bisher dachte ich, wenn man await einsetzt, dass dann gewartet wird bis der Befehl "erledigt" ist.

        Folgendes (gekürzt und vereinfacht) Script:

        // wenn ...Ansage auf true dann mp3 kopieren und Text ansagen
            on({id: "javascript.0.Geräte.Yamaha.Ansage", change: "any", val: true}, function() {  
        	...
                Beginn();
            });
        
        // Beginn
            async function Beginn() {
        	...
                await power();  
                await input_lautstaerke();
                await Dateien();
                await pruef_Verzeichnis(0);
            }
        
        // power on 
            async function power() {
                await request(yamaha + 'main/setPower?power=on', function (error, response, body) {
                    if (!error && response.statusCode == 200) { if (logging) log('power: ' + yamaha_IP + '; Power eingeschaltet');  } else {    log("power: Error: MusicCast = " + error);  }
                });
            }
        
        // Input_Lautstärke setzen
            async function input_lautstaerke() {
                ....
            }
        
        // Dateien kopieren
            async function Dateien() {
                    await Datei_kopieren ...
                    await request ....
            }
        
        // Verzeichnis prüfen
            async function pruef_Verzeichnis(index) {
                await request ....(yamaha + 'netusb/getListInfo?input=server&index=' + index + '"&size=8&lang=de', function (error, response, body) {
                    if (!error && response.statusCode == 200) {
                        .....
        		.....
                        .....
        		.....
                        setzen_Verzeichnis(Nr); 
                        .....
        		.....
                        play_Datei(); 
                });
            }
        
        // Verzeichnis setzen
            async function setzen_Verzeichnis(index) {
                	await request.....
        		.....
                        .....
                        pruef_Verzeichnis(0);
                    });
            }
        
        // Datei abspielen
            async function play_Datei() {
                log ("hier3");
                await request......
            }
        
        

        Nach meinem Verständnis müsste doch das log ganz unten:
        log ("hier3");
        zum Schluss kommen.
        Es kommt aber schon vorher.

        In den Funktionen "pruef_Verzeichnis" und "setzen_Verzeichnis" springt er immer hin und her, bevor letztendlich das richtige Verzeichnis erreicht ist. Erst dann geht es zu "play_Datei".

        Frage:
        Wie macht man es richtig ?

        P.S.:
        Ich kann auch gerne das komplette Script zur Verfügung stellen.

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

        @bahnuhr

        ich muss zugeben, ganz habe ich dieses thema noch nicht begriffen, aber während du auf einen profi wartest,der antwortet, hier mal ein video, das teilweise erklärt, warum es ein problem gibt
        https://www.youtube.com/watch?v=p7vAhDLUUZs

        meine vermutung: wenn du deine funktionen hintereinander aufrufst geben die kein "promise" zurück bzw sofort (z.b. async function pruef_Verzeichnis)

        soweit ich weiß, ist es besser mit axios anstatt request zu arbeiten, da dies alles besser integriert ist in axios. es liegt also meiner meinung nach an deinen unterfunktionen

        ich hoffe, ich habe nicht zuviel falsches geschrieben

        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
        • OliverIOO Offline
          OliverIOO Offline
          OliverIO
          schrieb am zuletzt editiert von
          #4

          @bahnuhr

          Await wartet solange bis das promise der aufgerufenen Funktion bestätigt (resolved) oder abgewiesen (reject) wird. Sobald das erfolgt wird die Rücksprungadresse auf dem Stack geschoben und auf gerufen, wenn alle vorherigen Aufrufe abgearbeitet sind.
          Aus dem

          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
          • bahnuhrB bahnuhr

            Guten Morgen,

            bisher dachte ich, wenn man await einsetzt, dass dann gewartet wird bis der Befehl "erledigt" ist.

            Folgendes (gekürzt und vereinfacht) Script:

            // wenn ...Ansage auf true dann mp3 kopieren und Text ansagen
                on({id: "javascript.0.Geräte.Yamaha.Ansage", change: "any", val: true}, function() {  
            	...
                    Beginn();
                });
            
            // Beginn
                async function Beginn() {
            	...
                    await power();  
                    await input_lautstaerke();
                    await Dateien();
                    await pruef_Verzeichnis(0);
                }
            
            // power on 
                async function power() {
                    await request(yamaha + 'main/setPower?power=on', function (error, response, body) {
                        if (!error && response.statusCode == 200) { if (logging) log('power: ' + yamaha_IP + '; Power eingeschaltet');  } else {    log("power: Error: MusicCast = " + error);  }
                    });
                }
            
            // Input_Lautstärke setzen
                async function input_lautstaerke() {
                    ....
                }
            
            // Dateien kopieren
                async function Dateien() {
                        await Datei_kopieren ...
                        await request ....
                }
            
            // Verzeichnis prüfen
                async function pruef_Verzeichnis(index) {
                    await request ....(yamaha + 'netusb/getListInfo?input=server&index=' + index + '"&size=8&lang=de', function (error, response, body) {
                        if (!error && response.statusCode == 200) {
                            .....
            		.....
                            .....
            		.....
                            setzen_Verzeichnis(Nr); 
                            .....
            		.....
                            play_Datei(); 
                    });
                }
            
            // Verzeichnis setzen
                async function setzen_Verzeichnis(index) {
                    	await request.....
            		.....
                            .....
                            pruef_Verzeichnis(0);
                        });
                }
            
            // Datei abspielen
                async function play_Datei() {
                    log ("hier3");
                    await request......
                }
            
            

            Nach meinem Verständnis müsste doch das log ganz unten:
            log ("hier3");
            zum Schluss kommen.
            Es kommt aber schon vorher.

            In den Funktionen "pruef_Verzeichnis" und "setzen_Verzeichnis" springt er immer hin und her, bevor letztendlich das richtige Verzeichnis erreicht ist. Erst dann geht es zu "play_Datei".

            Frage:
            Wie macht man es richtig ?

            P.S.:
            Ich kann auch gerne das komplette Script zur Verfügung stellen.

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

            @bahnuhr

            wollte mal ein wenig spielen - habe das in chatgpt eingegeben - kannst es ja mal testen

            Image 083.png

            async function input_lautstaerke() {
             return new Promise((resolve, reject) => {
               stand_alt_Input = getState('musiccast.0.' + MC_ID + '.main.input').val;
               if (logging) log('Input_Lautstärke setzen: stand_alt_Input = ' + stand_alt_Input);
               // prüfen input
               if (stand_alt_Input != "server") setState('musiccast.0.' + MC_ID + '.main.input', 'server');
               // Lautstärke
               stand_alt_Lautstaerke = getState('musiccast.0.' + MC_ID + '.main.volume').val;
               if (logging) log('Input_Lautstärke setzen: stand_alt_Lautstaerke = ' + stand_alt_Lautstaerke);
               setState('musiccast.0.' + MC_ID + '.main.volume', Ansage_Lautstaerke);
               if (logging) log('Input_Lautstärke setzen: Lautstärke gesetzt auf = ' + Ansage_Lautstaerke);
               resolve();
             });
            }
            
            

            man kann da auch gut lernen und ausprobieren indem man rücksprache hält - muss natürlich immer getestet werden, da noch in der entwicklung

            beispiel:

            frage:

            schreibe eine javascript function die hintereiander 3 andere funktionen mit await aufruft. die 3 anderen functionen sollen mit axios.get  je einen wert von einer webseite holen - die drei funktionen sollen jeweils als eigenständige function definiert sein
            

            antwort:

            async function getData() {
             try {
               const value1 = await getValue1();
               const value2 = await getValue2();
               const value3 = await getValue3();
               return [value1, value2, value3];
             } catch (error) {
               console.error(error);
               return null;
             }
            }
            
            async function getValue1() {
             try {
               const response = await axios.get('https://example.com/value1');
               const value = response.data * 10 + 5;
               const result = value > 10;
               return result;
             } catch (error) {
               console.error(error);
               return null;
             }
            }
            
            async function getValue2() {
             try {
               const response = await axios.get('https://example.com/value2');
               const result = response.data > 20;
               return result;
             } catch (error) {
               console.error(error);
               return null;
             }
            }
            
            async function getValue3() {
             try {
               const response = await axios.get('https://example.com/value3');
               const result = response.data.toUpperCase();
               return result;
             } catch (error) {
               console.error(error);
               return null;
             }
            }
            

            vilelleicht interessieren dich solche spielereien - ansonsten einfach überlesen :-)

            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
            1
            Antworten
            • In einem neuen Thema antworten
            Anmelden zum Antworten
            • Älteste zuerst
            • Neuste zuerst
            • Meiste Stimmen


            Support us

            ioBroker
            Community Adapters
            Donate

            729

            Online

            32.6k

            Benutzer

            82.2k

            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