Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. async / await - Verständnisfrage

    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

    async / await - Verständnisfrage

    This topic has been deleted. Only users with topic management privileges can see it.
    • bahnuhr
      bahnuhr Forum Testing Most Active last edited by 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-sky 3 Replies Last reply Reply Quote 0
      • ?
        A Former User @bahnuhr last edited by

        @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 Reply Last reply Reply Quote 0
        • liv-in-sky
          liv-in-sky @bahnuhr last edited by

          @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

          1 Reply Last reply Reply Quote 0
          • OliverIO
            OliverIO last edited by

            @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

            1 Reply Last reply Reply Quote 0
            • liv-in-sky
              liv-in-sky @bahnuhr last edited by

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

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

              Support us

              ioBroker
              Community Adapters
              Donate

              833
              Online

              31.8k
              Users

              80.0k
              Topics

              1.3m
              Posts

              4
              5
              213
              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