Permalink
Browse files

timers: fix clearInterval to work with timers from setTimeout

According to HTML Living Standard, "either method [clearInterval or
clearTimeout] can be used to clear timers created by setTimeout() or
setInterval().".

The current implementation of clearTimeout is already able to destroy a
timer created by setInterval, but not the other way around.

PR-URL: #19952
Refs: https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval
Reviewed-By: Anatoli Papirovski <apapirovski@mac.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
Reviewed-By: Tiancheng "Timothy" Gu <timothygu99@gmail.com>
  • Loading branch information...
remusao authored and BridgeAR committed Apr 11, 2018
1 parent 2b6bb9f commit 978e1524bba34fb92e6710f589329cd03cbec87b
Showing with 25 additions and 8 deletions.
  1. +2 −2 doc/api/timers.md
  2. +5 −6 lib/timers.js
  3. +18 −0 test/parallel/test-timers-clear-timeout-interval-equivalent.js
View
@@ -56,8 +56,8 @@ Returns a reference to the `Immediate`.
## Class: Timeout
This object is created internally and is returned from [`setTimeout()`][] and
[`setInterval()`][]. It can be passed to [`clearTimeout()`][] or
[`clearInterval()`][] (respectively) in order to cancel the scheduled actions.
[`setInterval()`][]. It can be passed to either [`clearTimeout()`][] or
[`clearInterval()`][] in order to cancel the scheduled actions.
By default, when a timer is scheduled using either [`setTimeout()`][] or
[`setInterval()`][], the Node.js event loop will continue running as long as the
View
@@ -496,14 +496,13 @@ exports.setInterval = function(callback, repeat, arg1, arg2, arg3) {
return timeout;
};
exports.clearInterval = function(timer) {
if (timer && timer._repeat) {
timer._repeat = null;
clearTimeout(timer);
}
exports.clearInterval = function clearInterval(timer) {
// clearTimeout and clearInterval can be used to clear timers created from
// both setTimeout and setInterval, as specified by HTML Living Standard:
// https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval
clearTimeout(timer);
};
function unrefdHandle(timer, now) {
try {
// Don't attempt to call the callback if it is not a function.
@@ -0,0 +1,18 @@
'use strict';
const common = require('../common');
// This test makes sure that timers created with setTimeout can be disarmed by
// clearInterval and that timers created with setInterval can be disarmed by
// clearTimeout.
//
// This behavior is documented in the HTML Living Standard:
//
// * Refs: https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-setinterval
// Disarm interval with clearTimeout.
const interval = setInterval(common.mustNotCall(), 1);
clearTimeout(interval);
// Disarm timeout with clearInterval.
const timeout = setTimeout(common.mustNotCall(), 1);
clearInterval(timeout);

0 comments on commit 978e152

Please sign in to comment.