Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Script auf Ende einer Funktion warten lassen

    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

    Script auf Ende einer Funktion warten lassen

    This topic has been deleted. Only users with topic management privileges can see it.
    • D
      dondento last edited by

      Hallo,

      ich möchte ein Script erstellen, das eine globale Funktion aufruft.
      Die globale Funktion soll auf einen bestimmten Zustand eines Datenpunktes warten und den Wert an das Script zurückgeben. Das Script soll dabei warten, bis die globale Funktion beendet ist.
      Leider deaktiviert sich sich die Javascript-Instanz jedesmal. Ich habe auch schon alles mögliche mit 'async' und 'await' getestet.
      Weiss jemand eine Möglichkeit, dies zu realisieren?

      arteck 1 Reply Last reply Reply Quote 0
      • arteck
        arteck Developer Most Active @dondento last edited by

        @dondento zeigmal das script

        D 1 Reply Last reply Reply Quote 0
        • D
          dondento @arteck last edited by

          @arteck

          Sollte eigentlich so funktionieren:

          Script:

          ....
          setState('0_userdata.0.MessageBox.cmdString','Fehler;Bitte Menge oder Stückzahl eingeben;OK;Cancel');
          result = Messagebox(); Hier sollte das Script auf 'result' warten.
          ....

          Globale Funktion:

          var result;

          async function MessageBox()
          {
          var cmdString = getState('0_userdata.0.MessageBox.cmdString').val;
          var cmdArray = cmdString.split(';');

          if (cmdArray.length<3) return;
          
          setState('0_userdata.0.MessageBox.Titel', cmdArray[0],true);
          setState('0_userdata.0.MessageBox.Text',cmdArray[1],true);    
          setState('0_userdata.0.MessageBox.Button1.Text', cmdArray[2],true);
          
          result='NaN';
          setState('0_userdata.0.MessageBox.Button1.Sichtbar',true);
          setState('0_userdata.0.MessageBox.Button1.Clicked',false);   
          
          if (cmdArray.length==3) {
              setState('0_userdata.0.MessageBox.Button1.PositionX',215,false);
              setState('0_userdata.0.MessageBox.Button1.PositionY',170,false);
              setState('0_userdata.0.MessageBox.Button2.Sichtbar',false,false);
          } 
          
          if (cmdArray.length==4) {
              setState('0_userdata.0.MessageBox.Button1.PositionX',70,false);
              setState('0_userdata.0.MessageBox.Button1.PositionY',170,false);
          
              setState('0_userdata.0.MessageBox.Button2.Text',cmdArray[3],true);
              setState('0_userdata.0.MessageBox.Button2.Sichtbar',true,false); 
              setState('0_userdata.0.MessageBox.Button2.Clicked',false,false);        
              setState('0_userdata.0.MessageBox.Button2.PositionX',320,false);
              setState('0_userdata.0.MessageBox.Button2.PositionY',170,false); 
          }
          
          setStateDelayed('0_userdata.0.MessageBox.Sichtbar',true,500)
          
          await schleife();
          
          setState('0_userdata.0.MessageBox.Result'/*Result*/,result,true);
          setState('0_userdata.0.MessageBox.Sichtbar'/*Sichtbar*/,false,true);
          
          return result;
          

          }

          function schleife()
          {
          while(result == 'NaN') {}
          }

          // Button 1 wurde geklicked
          on ({id:'0_userdata.0.MessageBox.Button1.Clicked',val:true}, async function(obj){
          obj.state.val=false;
          setState('0_userdata.0.MessageBox.Result',getState('0_userdata.0.MessageBox.Button1.Text').val);
          result=getState('0_userdata.0.MessageBox.Button1.Text'/Text/).val;
          });

          // Button 2 wurde geklicked
          on ({id:'0_userdata.0.MessageBox.Button2.Clicked',val:true}, async function(obj){
          obj.state.val=false;
          setState('0_userdata.0.MessageBox.Result',getState('0_userdata.0.MessageBox.Button2.Text').val);
          result=getState('0_userdata.0.MessageBox.Button2.Text'/Text/).val;
          });

          AlCalzone 1 Reply Last reply Reply Quote 0
          • AlCalzone
            AlCalzone Developer @dondento last edited by

            @dondento Ne so geht das nicht.

            Wenn du auf das Ende einer async function warten willst, brauchst du ein await vorm Aufruf (hier result = await MessageBox()).
            Außerdem sind Dauerschleifen zum "warten" tödlich und sorgen dafür dass gar nix mehr geht.
            Am besten setzt du dich mal mit Promises und asynchroner Programmierung auseinander.

            D 1 Reply Last reply Reply Quote 1
            • D
              dondento @AlCalzone last edited by

              @alcalzone
              Das habe ich mir schon gedacht.

              Vielen Dank

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

              Support us

              ioBroker
              Community Adapters
              Donate

              823
              Online

              31.8k
              Users

              80.0k
              Topics

              1.3m
              Posts

              3
              5
              553
              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