Fix bug: Clock can't be stopped when 'Start' clicked while running
This commit is contained in:
parent
e1a3f634a4
commit
d4c23dcf37
2 changed files with 13 additions and 5 deletions
|
@ -39,15 +39,18 @@ The clock-managing functions:
|
||||||
```js
|
```js
|
||||||
let timerId;
|
let timerId;
|
||||||
|
|
||||||
function clockStart() { // run the clock
|
function clockStart() { // run the clock
|
||||||
timerId = setInterval(update, 1000);
|
if (!timerId) { // only set a new interval if the clock is not running
|
||||||
|
timerId = setInterval(update, 1000);
|
||||||
|
}
|
||||||
update(); // (*)
|
update(); // (*)
|
||||||
}
|
|
||||||
|
|
||||||
function clockStop() {
|
function clockStop() {
|
||||||
clearInterval(timerId);
|
clearInterval(timerId);
|
||||||
timerId = null;
|
timerId = null; // (**)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Please note that the call to `update()` is not only scheduled in `clockStart()`, but immediately run in the line `(*)`. Otherwise the visitor would have to wait till the first execution of `setInterval`. And the clock would be empty till then.
|
Please note that the call to `update()` is not only scheduled in `clockStart()`, but immediately run in the line `(*)`. Otherwise the visitor would have to wait till the first execution of `setInterval`. And the clock would be empty till then.
|
||||||
|
|
||||||
|
Also it is important to set a new interval in `clockStart()` only when the clock is not running. Otherways clicking the start button several times would set multiple concurrent intervals. Even worse - we would only keep the `timerID` of the last interval, losing references to all others. Then we wouldn't be able to stop the clock ever again! Note that we need to clear the `timerID` when the clock is stopped in the line `(**)`, so that it can be started again by running `clockStart()`.
|
||||||
|
|
|
@ -43,12 +43,17 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
function clockStart() {
|
function clockStart() {
|
||||||
timerId = setInterval(update, 1000);
|
// set a new interval only if the clock is stopped
|
||||||
|
// otherwise we would rewrite the timerID reference to the running interval and wouldn't be able to stop the clock ever again
|
||||||
|
if (!timerId) {
|
||||||
|
timerId = setInterval(update, 1000);
|
||||||
|
}
|
||||||
update(); // <-- start right now, don't wait 1 second till the first setInterval works
|
update(); // <-- start right now, don't wait 1 second till the first setInterval works
|
||||||
}
|
}
|
||||||
|
|
||||||
function clockStop() {
|
function clockStop() {
|
||||||
clearInterval(timerId);
|
clearInterval(timerId);
|
||||||
|
timerId = null; // <-- clear timerID to indicate that the clock has been stopped, so that it is possible to start it again in clockStart()
|
||||||
}
|
}
|
||||||
|
|
||||||
clockStart();
|
clockStart();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue