summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/api/timers.md4
-rw-r--r--lib/timers.js11
-rw-r--r--test/parallel/test-timers-clear-timeout-interval-equivalent.js18
3 files changed, 25 insertions, 8 deletions
diff --git a/doc/api/timers.md b/doc/api/timers.md
index 9c455552b1..0cc535352a 100644
--- a/doc/api/timers.md
+++ b/doc/api/timers.md
@@ -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
diff --git a/lib/timers.js b/lib/timers.js
index 88fd31ad4c..ad00ede974 100644
--- a/lib/timers.js
+++ b/lib/timers.js
@@ -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.
diff --git a/test/parallel/test-timers-clear-timeout-interval-equivalent.js b/test/parallel/test-timers-clear-timeout-interval-equivalent.js
new file mode 100644
index 0000000000..94611b7070
--- /dev/null
+++ b/test/parallel/test-timers-clear-timeout-interval-equivalent.js
@@ -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);