Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Entwicklung
    4. [gelöst] setTimout / clearTimeout iobroker.feiertage

    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

    [gelöst] setTimout / clearTimeout iobroker.feiertage

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

      Hallo,

      der Adapter Checker hat mir einen Fehler ausgeworfen:

      [W505] setTimeout found in "main.js", but no clearTimeout detected
      

      Betroffener Code in Github (Link):

      
      adapter.on("ready", function () {
          adapter.getForeignObject("system.config", function (err, data) {
              if (data && data.common) {
                  lang = data.common.language;
              }
      
              adapter.log.debug("adapter feiertage initializing objects");
              checkHolidays();
              adapter.log.info("adapter feiertage objects written");
      
              setTimeout(function () {
                  adapter.log.info("force terminating after 1 minute");
                  adapter.stop();
              }, 60000);
      
          });
      });
      

      Ich bin nicht sicher, wie ich es ändern sollte. Meine Idee:

      var terminating_timer;
      
      function forceTerminating () {
          adapter.log.info("force terminating after 1 minute");
          clearTimeout(terminating_timer);
          adapter.stop();
      }
      
      adapter.on("ready", function () {
          adapter.getForeignObject("system.config", function (err, data) {
              if (data && data.common) {
                  lang = data.common.language;
              }
      
              adapter.log.debug("adapter feiertage initializing objects");
              checkHolidays();
              adapter.log.info("adapter feiertage objects written");
              
              clearTimeout(terminating_timer);
              terminating_timer = setTimeout(forceTerminating, 60000);
      
          });
      });
      

      Richtig so?

      Gruß
      Pix

      crycode 1 Reply Last reply Reply Quote 0
      • P
        pix last edited by

        Schiebe nach oben

        1 Reply Last reply Reply Quote 0
        • crycode
          crycode Developer @pix last edited by

          @pix Nicht ganz...

          Zuerst ein mal brauchst den clearTimeout nicht mehr extra in deiner forceTerminating Funktion aufrufen, da die ja eh nur aufgerufen wird, wenn der Timeout bereits zugeschlagen hat.

          Wenn ich das richtig sehe, dann willst du mit dem Timeout sicherstellen, dass der Adapter auch wirklich nach der einen Minute wieder beendet wird.
          In dem Fall solltest du setTimeout direkt am Anfang von der on ready Funktion aufrufen um den Timeout zu starten und dann clearTimeout an der Stelle, wo du sicher sagen kannst, dass alles abgearbeitet wurde und der Adapter sich beenden soll.

          Da du mehrere adapter.stop() Aufrufe drin hast, könnte man das evlt. in eine eigene stop() Funktion auslagern und in dieser clearTimeout(...) und adapter.stop() nacheinander aufrufen.

          P 1 Reply Last reply Reply Quote 1
          • P
            pix @crycode last edited by pix

            @crycode Danke für die Unterstützung.

            Die Funktion forceTerminationg() hat ja schon den adapter.stop() drin. Das sollte damit gehen.

            var terminating_timer;
             
            function forceTerminating () {  // soll statt adapter.stop() aufgerufen werden
                adapter.log.info("force terminating after 1 minute");
                clearTimeout(terminating_timer);
                adapter.stop();
            }
             
            adapter.on("ready", function () {
                terminating_timer = setTimeout({
                    adapter.getForeignObject("system.config", function (err, data) {
                        if (data && data.common) {
                            lang = data.common.language;
                        }
                     
                        adapter.log.debug("adapter feiertage initializing objects");
                        checkHolidays();
                        adapter.log.info("adapter feiertage objects written");
                            
                        forceTerminating();
                    });
                }, 60000);
            });
            
            

            Ist es das, was du meintest?

            Gruß
            Pix

            EDIT: Jetzt beim Drüberlesen, kommt mit das falsch vor. Der Code im Timeout soll ja nicht erst nach 1min ausgeführt werden, sondern das Beenden des Adapters soll spätestens 1min nach Durchlaufen des Codes erfolgen. Hmmm...

            crycode 1 Reply Last reply Reply Quote 0
            • crycode
              crycode Developer @pix last edited by

              @pix sagte in [Frage] setTimout / clearTimeout iobroker.feiertage:

              Ist es das, was du meintest?

              Nein, das sieht irgendwie seltsam aus...

              Ich meinte eher so z.B.:

              var terminating_timer;
              
              function stopAdapter (isTimeout) {
                clearTimeout(terminating_timer);
                if (isTimeout) {
                  adapter.log.info("force terminating after 1 minute");
                }
                adapter.stop();
              }
              
              adapter.on("ready", function () {
                terminating_timer = setTimeout(() => stopAdapter(true), 60000);
              
                adapter.getForeignObject("system.config", function (err, data) {
                  if (data && data.common) {
                    lang = data.common.language;
                  }
              
                  adapter.log.debug("adapter feiertage initializing objects");
                  checkHolidays();
                  adapter.log.info("adapter feiertage objects written");
                });
              });
              

              Zusätzlich solltest du dann alle Aufrufe von adapter.stop(); in deinem Code durch stopAdapter(); ersetzen, damit der Timeout gelöscht wird.

              P 1 Reply Last reply Reply Quote 1
              • P
                pix @crycode last edited by

                @crycode Vielen Dank für die Unterstützung. Habe nun die Verbesserungen schon mal im Adapter Feiertage eingepflegt. Der Adapter-Checker meckert nicht mehr 🙂

                Weitere folgen.

                Gruß
                Pix

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

                Support us

                ioBroker
                Community Adapters
                Donate

                904
                Online

                31.9k
                Users

                80.2k
                Topics

                1.3m
                Posts

                adapter feiertage javascript script settimeout timer
                2
                6
                405
                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