Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Anfänger Frage zu Schleife mit Timeout/Interval

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Anfänger Frage zu Schleife mit Timeout/Interval

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

      Im Prinzip so …

      for (var i=0; i<5; i++) {
          setTimeout(function(){ saveImage();},i*3000);
      }
      

      Klappt aber nur, wenn saveImage() in weniger als 3s fertig wird.

      1 Reply Last reply Reply Quote 0
      • P
        ple last edited by

        Muss jetzt los, teste ich heute abend mal.

        Auf der schnelle, warum "i" was der Interval ist, mal 3000? Denke die 3000 sind die ms?

        Gruß und Danke

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

          @ple:

          Auf der schnelle, warum "i" was der Interval ist, mal 3000? Denke die 3000 sind die ms? `
          Du setzt damit gleichzeitig 5 Timeouts: 0, 3000, 6000, 9000 und 12000ms

          Ist im Prinzip das gleiche wie 5x nacheinander Timeouts zu setzen, aber ein bisschen einfacher in der Umsetzung.

          1 Reply Last reply Reply Quote 0
          • blauholsten
            blauholsten Developer last edited by

            @ple:

            Muss jetzt los, teste ich heute abend mal.

            Auf der schnelle, warum "i" was der Interval ist, mal 3000? Denke die 3000 sind die ms?

            Gruß und Danke `
            Die for Schleife, führt ihre Bedingungen solange aus bis diese nicht mehr zutrifft. In diesem Fall 5…dabei wird die Variable i immer um eins erhöht. In der Anweisung der for Schleife wird nun eine anonyme callback function angelegt, die dann i*3000ms, die saveimage() Funktion aufruft.....3s,6s,9s...usw.

            1 Reply Last reply Reply Quote 0
            • P
              ple last edited by

              wollte es gerade testen, aber der meckert irgendwie
              1241_bildschirmfoto_2017-08-25_um_11.05.56.png

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

                @ple:

                wollte es gerade testen, aber der meckert irgendwie `
                Funktionen in einer Schleife können unerwartete Konsequenzen haben, was Parameter angeht. Man erwartet, dass die nacheinander mit dem jeweiligen Wert der Schleifenvariable erstellt werden, tatsächlich hat man nachher mehrere Kopien, die alle auf den letzten Wert referenzieren. Es gibt Konstrukte, wie man das verhindern kann, aber das ist hier Overkill.

                In deinem Fall, wäre das vollkommen ok. So gehts aber auch ohne Warnung:

                for (var i=0; i<5; i++) {
                    setTimeout(saveImage, i*3000);
                }
                

                Man beachte die fehlenden Klammern hinter saveImage => es wird nur die Funktionsreferenz übergeben, die später von setTimeout ausgeführt wird.

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

                  Anstelle 5 Timer zu erzeugen, würde ich setInterval() zusammen mit einer Zählvariable verwenden. Etwa so:

                  var timer = null;
                  var count = 0;
                  
                  function counter() {
                      saveimage();
                      count--;
                      if(count === 0 && timer) clearInterval(timer);
                  }    
                  
                  on({id: "hm-rpc.0.NEQ0629079.1.STATE"/*Flur_FK_Haustür:1.STATE*/, val: true}, function () {
                      count = 5;
                      counter();
                      timer = setInterval(counter, 3000);
                  });
                  
                  1 Reply Last reply Reply Quote 0
                  • P
                    ple last edited by

                    Vielen Dank für eure Ideen,

                    Umgesetzt habe ich jetzt den Vorschlag von Paul 53, das kann ich nachvollziehen und wäre auch meine Richtung gewesen, wenn ich gewusst hätte wie der Syntax aussehen muss.

                    Hat auch den Vorteil, dass ich die Funktion abbrechen kann.

                    Das Beispiel kann ich auch auf andere Projekte umsetzen.

                    Die For Schleife von AlCalzone ist auch sehr interessant, kann ich dann auf andere Anwendungen anweisen. Vielen Dank.

                    Besteht da auch die Möglichkeit die erzeugten Timer irgendwie abzubrechen?

                    Gruß

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

                      @ple:

                      Besteht da auch die Möglichkeit die erzeugten Timer irgendwie abzubrechen? `
                      Da müsstest du alle Timer in ein Array packen und die dann zum Abbrechen nutzen:

                      var timers = [];
                      // Erstellen:
                      for (var i=0; i<5; i++) {
                      	timers.push(setTimeout(saveImage, i*3000));
                      }
                      
                      // abbrechen:
                      while (timers.length > 0) {
                      	clearTimeout(timers.pop());
                      }
                      
                      
                      1 Reply Last reply Reply Quote 0
                      • P
                        ple last edited by

                        @AlCalzone:

                        @ple:

                        Besteht da auch die Möglichkeit die erzeugten Timer irgendwie abzubrechen? `
                        Da müsstest du alle Timer in ein Array packen und die dann zum Abbrechen nutzen:

                        var timers = [];
                        // Erstellen:
                        for (var i=0; i<5; i++) {
                        	timers.push(setTimeout(saveImage, i*3000));
                        }
                        
                        // abbrechen:
                        while (timers.length > 0) {
                        	clearTimeout(timers.pop());
                        }
                        
                        ```` `  
                        

                        Eh, ja, guck ich mir nach dem Urlaub an 😉

                        Danke

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        848
                        Online

                        31.7k
                        Users

                        79.8k
                        Topics

                        1.3m
                        Posts

                        5
                        11
                        1895
                        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