Skip to content
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

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

PR-URL: #19952
Reviewed-By: Anatoli Papirovski <>
Reviewed-By: Ruben Bridgewater <>
Reviewed-By: Jeremiah Senkpiel <>
Reviewed-By: Tiancheng "Timothy" Gu <>
  • Loading branch information
remusao authored and BridgeAR committed Apr 16, 2018
1 parent 2b6bb9f commit 978e1524bba34fb92e6710f589329cd03cbec87b
Showing with 25 additions and 8 deletions.
  1. +2 −2 doc/api/
  2. +5 −6 lib/timers.js
  3. +18 −0 test/parallel/test-timers-clear-timeout-interval-equivalent.js
@@ -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
@@ -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;
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:

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:

// Disarm interval with clearTimeout.
const interval = setInterval(common.mustNotCall(), 1);

// Disarm timeout with clearInterval.
const timeout = setTimeout(common.mustNotCall(), 1);

0 comments on commit 978e152

Please sign in to comment.
You can’t perform that action at this time.