NEWS
[gelöst] setTimout / clearTimeout iobroker.feiertage
-
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 -
Schiebe nach oben
-
@pix Nicht ganz...
Zuerst ein mal brauchst den
clearTimeout
nicht mehr extra in deinerforceTerminating
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 dusetTimeout
direkt am Anfang von der on ready Funktion aufrufen um den Timeout zu starten und dannclearTimeout
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 eigenestop()
Funktion auslagern und in dieserclearTimeout(...)
undadapter.stop()
nacheinander aufrufen. -
@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ß
PixEDIT: 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...
-
@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 durchstopAdapter();
ersetzen, damit der Timeout gelöscht wird. -
@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