Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [Frage] Timer oder Interval in Funktion löschen

    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

    [Frage] Timer oder Interval in Funktion löschen

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

      Hallo Zusammen,

      ich hab da mal zwei Fragen zu Timern bzw. bei Intervallen wird höchstwahrscheinlich ähnlich sein.

      Ein Timer/Timeout lässt sich ja mit folgendem Code leeren:

      clearTimeout(timeout);
      timeout = null;
      

      Und danach ist timeout null.
      Jetzt hab ich eine Funktion die genau das macht, aber nach dem Ausführen ist timeout immer noch ein object..

      1. Wie kann ich einen Timeout mittels einer Funktion löschen?

      Weiterhin:
      Ich frage einen laufenden Timeout immer mit if(timeout) ab und wenn ich den so lösche, dass er null ist klappt das auch, aber das ist er auch nach ablaufen nicht.
      2. Muss ich den timeout nach ablaufen noch selber löschen?

      Beispiel:

      let timeout,timeout2;
      
      function clearT(time){
         clearTimeout(time);
         time = null;
      }
      
      timeout = setTimeout(() =>{},2000)
      clearT(timeout)
      log('Gelöscht: ' + String(timeout));
      
      timeout2 = setTimeout(() =>{},2000)
      clearTimeout(timeout2);
      timeout2 = null;
      log('null: ' + String(timeout2));
      
      

      Ausgabe:
      4d2eb1c8-f1a1-450e-8c32-fa869888681a-image.png

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

        @CruziX sagt:

        Ich frage einen laufenden Timeout immer mit if(timeout) ab und wenn ich den so lösche, dass er null ist klappt das auch, aber das ist er auch nach ablaufen nicht.

        Das Timer-Objekt wird bei Ablauf der Verzögerungszeit nicht automatisch null (null ist übrigens ein Objekt). Wenn man mit if(timeout) abfragt, muss man die Variable bei Ablauf auf null setzen.

        C 1 Reply Last reply Reply Quote 0
        • C
          CruziX @paul53 last edited by

          @paul53 Ok, danke für die Erklärung.
          Weißt du vielleicht auch eine Lösung für meine erste Frage?

          Mic paul53 2 Replies Last reply Reply Quote 0
          • Mic
            Mic Developer @CruziX last edited by

            @CruziX sagte in [Frage] Timer oder Interval in Funktion löschen:

            Weißt du vielleicht auch eine Lösung für meine erste Frage?

            Was möchtest du denn, lieber undefined, oder doch null?

            Schau mal hier:

            let mytimeout = setTimeout(function() {
                log('Timeout ausgeführt. Hallo Welt :-)');
            }, 60 * 1000);
            log('Typenprüfung mytymeout Start: ' + (typeof mytimeout));
            
            clearTimeout(mytimeout);
            log('Typenprüfung mytymeout clearTimeout(mytimeout): ' + (typeof mytimeout));
            
            mytimeout = null;
            log('Typenprüfung mytimeout = null: ' + (typeof mytimeout));
            log('Ausgabe mytimeout-Variable nach = null: ' + mytimeout);
            
            mytimeout = undefined;
            log('Typenprüfung mytimeout = undefined: ' + (typeof mytimeout));
            

            Ergibt:

            Typenprüfung mytymeout Start: object
            Typenprüfung mytymeout clearTimeout(mytimeout): object
            Typenprüfung mytimeout = null: object
            Ausgabe mytimeout nach = null: null
            Typenprüfung mytimeout = undefined: undefined
            
            C 1 Reply Last reply Reply Quote 0
            • Mic
              Mic Developer last edited by

              Update:

              let mytimeout = setTimeout(function() {
                  log('Timeout ausgeführt. Hallo Welt :-)');
              }, 60 * 1000);
              log('Typenprüfung mytymeout Start: ' + (typeof mytimeout));
               
              clearTimeout(mytimeout);
              log('Typenprüfung mytymeout clearTimeout(mytimeout): ' + (typeof mytimeout));
              log('Ausgabe mytimeout-Variable nach clearTimeout(mytimeout): ' + JSON.stringify(mytimeout)); 
              
              mytimeout = null;
              log('Typenprüfung mytimeout = null: ' + (typeof mytimeout));
              log('Ausgabe mytimeout-Variable nach = null: ' + mytimeout);
               
              mytimeout = undefined;
              log('Typenprüfung mytimeout = undefined: ' + (typeof mytimeout));
              

              Ergibt:

              Typenprüfung mytymeout Start: object
              Typenprüfung mytymeout clearTimeout(mytimeout): object
              Ausgabe mytimeout-Variable nach clearTimeout(mytimeout): {"_called":false,"_idleTimeout":-1,"_idlePrev":null,"_idleNext":null,"_idleStart":81543485,"_onTimeout":null,"_timerArgs":[null,null,null,null],"_repeat":null,"_destroyed":false}
              Typenprüfung mytimeout = null: object
              Ausgabe mytimeout-Variable nach = null: null
              

              Teste selbst grad mit Timeouts 🙂

              1 Reply Last reply Reply Quote 0
              • C
                CruziX @Mic last edited by

                @Mic danke, null wäre eig gut, aber ich würde das ja gerne in einer Funktion machen.
                Das funktioniert aber leider nicht, sonst müsste danach der timeout ja null sein 😮
                Aber der timeout ist doch ein objekt, also sollte das doch per call by reference geschehen und der richtige timeout auf null gesetzt werden 🤔

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

                  @CruziX sagte:

                  Lösung für meine erste Frage?

                  In Javascript ist mir keine Methode zur Variablenübergabe per Referenz (Zeiger) bekannt.
                  Wenn man viele Timer verwendet, fällt mir nur die Array-Methode ein.

                  var timers = [];
                  
                  function clearT(i){
                     clearTimeout(timers[i]);
                     timers[i] = null;
                  }
                  
                  timers[0] = setTimeout(function() {
                      clearT(0);
                      log(timers[0]);
                  }, 1000);
                  
                  C 1 Reply Last reply Reply Quote 0
                  • Mic
                    Mic Developer last edited by

                    Erste Idee: ggf. könntest du auch alternativ das Objekt abfragen:

                    Ausgabe mytimeout-Variable nach clearTimeout(mytimeout): {"_called":false,"_idleTimeout":-1,"_idlePrev":null,"_idleNext":null,"_idleStart":81543485,"_onTimeout":null,"_timerArgs":[null,null,null,null],"_repeat":null,"_destroyed":false}
                    Typenprüfung mytimeout = null: object
                    Ausgabe mytimeout-Variable nach = null: null
                    
                    

                    Also etwa mytymeout._onTimemout (falls das der beste Objekt-Schlüssel hierfür ist) Also falls false, dann mach xxx

                    C 1 Reply Last reply Reply Quote 0
                    • C
                      CruziX @paul53 last edited by

                      @paul53 sagte in [Frage] Timer oder Interval in Funktion löschen:

                      @CruziX sagte:

                      Lösung für meine erste Frage?

                      In Javascript ist mir keine Methode zur Variablenübergabe per Referenz (Zeiger) bekannt.
                      Wenn man viele Timer verwendet, fällt mir nur die Array-Methode ein.

                      var timers = [];
                      
                      function clearT(i){
                         clearTimeout(timers[i]);
                         timers[i] = null;
                      }
                      
                      timers[0] = setTimeout(function() {
                          clearT(0);
                          log(timers[0]);
                      }, 1000);
                      

                      Ich hatte mal gelesen, in JavaScript werden alle primitiven Datentypen call by value und alle Objekte call by reference übergeben, aber vielleicht ist das auch falsch

                      paul53 1 Reply Last reply Reply Quote 0
                      • C
                        CruziX @Mic last edited by

                        @Mic Danke für den Tipp, werde ich mir mal anschauen.
                        Das tolle..
                        ich hab in einem global Skript 2 Funktionen zum Löschen von Timeouts und Intervallen, jetzt darf ich mir was überlegen 😅
                        Ein paar Sachen haben nie wie gewünscht funktioniert und jetzt glaube ich, dass es daran lag 😛

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

                          @CruziX sagte :

                          in JavaScript werden alle primitiven Datentypen call by value und alle Objekte call by reference übergeben

                          Das stimmt schon, weshalb man innerhalb einer Funktion auch die Attribute eines Objektes ändern kann, aber nicht das Objekt selbst. Im ersten Post ist time eine lokale Variable und es bewirkt nichts, diese auf null zu setzen.

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          738
                          Online

                          31.8k
                          Users

                          80.0k
                          Topics

                          1.3m
                          Posts

                          3
                          11
                          363
                          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