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. Script auf Ende einer Funktion warten lassen

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    1.9k

Script auf Ende einer Funktion warten lassen

Geplant Angeheftet Gesperrt Verschoben JavaScript
5 Beiträge 3 Kommentatoren 631 Aufrufe 2 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.
  • D Offline
    D Offline
    dondento
    schrieb am zuletzt editiert von
    #1

    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?

    arteckA 1 Antwort Letzte Antwort
    0
    • D dondento

      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?

      arteckA Offline
      arteckA Offline
      arteck
      Developer Most Active
      schrieb am zuletzt editiert von
      #2

      @dondento zeigmal das script

      zigbee hab ich, zwave auch, nuc's genauso und HA auch

      D 1 Antwort Letzte Antwort
      0
      • arteckA arteck

        @dondento zeigmal das script

        D Offline
        D Offline
        dondento
        schrieb am zuletzt editiert von
        #3

        @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;
        });

        AlCalzoneA 1 Antwort Letzte Antwort
        0
        • D dondento

          @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;
          });

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

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

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

          D 1 Antwort Letzte Antwort
          1
          • AlCalzoneA AlCalzone

            @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 Offline
            D Offline
            dondento
            schrieb am zuletzt editiert von
            #5

            @alcalzone
            Das habe ich mir schon gedacht.

            Vielen Dank

            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

            898

            Online

            32.6k

            Benutzer

            82.0k

            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