NEWS
Schedule
-
Hallo,
Kleiner Hinweis für "unbedarfte javascript-Programmierer", wie ich einer bin.
Beim Programmieren der Skripte sind mir bei der Verwendung von "schedule" ein paar Fehler unterlaufen, die - warum auch immer - dazu geführt haben, dass anschliessend gar keine Skripte mehr ausgeführt wurden (Status der Instanz javascript blieb aber "grün")
A) schedule ruft die Funktion auf, in der es selber enthalten ist. Wenn das oft genug durchgeführt wurde (bei mir jede Sekunde), ist irgendwann Schluss. War also eine schlechte Idee…
` > function test(){
if (xyz) schedule(….,function(){test();});
else log("Ende");
} `
Ich hab das jetzt durch ein schedule("*/x *..",function(){test();}) in einer anderen Funktion gelöst. Der Abruch erfolgt nun ebenfalls durch clearSchedule() von ausserhalb test();.
B) hier bin ich noch nicht sicher, warum das heute zum kompletten Absturz geführt hat. Ich musste den RASPI zweimal neu starten, bis Skripte wieder ausgeführt wurden.
` > var startzeit ="2017-04-01 15:15:00";var dt = startzeit.split(" ");
var datum = dt[0].split("-");
var uhrzeit = dt[1].split(":");
schedule({year: datum[0], month: datum[1], day: datum[2], hour: uhrzeit[0], minute: uhrzeit[1]}, function….}; `
Hier bin ich nicht sicher, oba) der string typ der Übergabeparameter,
b) die leider in der Vergangenheit liegende Uhrzeit oder
c) die Parameter "year", "month", "day" mir den ärger gemacht haben
Vielleicht kann mir zu B) jemand einen Hinweis geben?
Danke !
Georg
-
Kurzer Hinweis, warum A) probleme macht:
schedule wird üblicherweise verwendet, wiederkehrende Aufgaben regelmäßig auszuführen (jede Sekunde, etc). Ich vermute, du verwendest die Funktion ähnlich wie setTimeout, das nur einmalig die Funktion ausführt. schedule ist aber zu vergleichen mit setInterval, das bis zum Stop regelmäßig die Funktion immer wieder aufruft.
Daher erstellst du sozusagen in einer Schleife endlos neue schedules. Jeder Aufruf von Test erzeugt einen neuen, der zusätzlich zu den alten aufgerufen wird, jeder * steht für einen Funktionsaufruf:
außerhalb * | Test (1) * | * | Test (2) * | * | * | Test (3) * | * | * | * | Test (4) ...
Korrekt wäre: Außerhalb der Funktion einmalig den schedule erstellen und bei Bedarf beenden. Oder du weichst auf setTimeout aus und machst es wie in deinem Code oben.
Zu B kann ich dir ohne Test-Code und ioBroker leider gerade nicht helfen. Vielleicht sieht ja jemand anders das Rroblem
-
Hallo,
ich bekomme vom Editor immer die Warnmeldung "Do not put a function in a function" oder ähnlich, wenn ich schedule in eine Funktion packe. Auf diese Meldungen achten (kommen links von der entsprechenden Zeile)!
Pix
-
Eigentlich spricht da erst mal nichts dagegen. Anynome Funktionen sind bei Callbacks, setTimeout, etc. recht gängig.
-
ich war auch etwas überrascht. Den Fall A) hab ich 2 mal nachgestellt und es war reproduzierbar. Im Fall B hab ich nicht weiter gesucht.
-
Wenn du einen bestimmten Termin, und nicht stündliche oder menütliche Ereignisse vewenden willst würd ich eher mit setTimeout arbeiten.
Schaut ca so aus:
var startzeit =new Date("2017-04-06 15:15:00"); setTimeout(function() {}, startzeit.getTime()-Date.now());
Startzeit muss nur in der Zukunft liegen.
-
ja, danke
setTimeout müsste ich mit setInterval verwenden, da ich den Aufruf zyklisch brauche (muss ich noch ausprobieren)
schedule hat für meinen Anwendungsfall noch eine andere schwäche: Wenn man eine Funktion alle 15 Minuten aufrufen will (also schedule("*/15 * * * *", function () ….") dann wird die Funktion immer um xx:00, xx:15, xx:30, xx:45 aufgerufen.
Ich will aber eine Funktion von "jetzt" an alle 2 Minuten auszuführen. Mit schedule passiert es, dass die Funktion dann im schlechtesten Fall 1 Sekunde später aufgerufen wird.
-
Ich will aber eine Funktion von "jetzt" an alle 2 Minuten auszuführen. Mit schedule passiert es, dass die Funktion dann im schlechtesten Fall 1 Sekunde später aufgerufen wird. `
Dann ist setInterval dein Freund.
-
OK - danke!