diff options
author | Anatoli Papirovski <apapirovski@mac.com> | 2018-04-11 11:04:56 +0200 |
---|---|---|
committer | Ruben Bridgewater <ruben@bridgewater.de> | 2018-04-29 16:51:05 +0200 |
commit | 198eb9c5d6ac6a90dadb8c58396f9b35eaf6f5ce (patch) | |
tree | 7d3c8b584ce126e9ac2b8cdf66eaa6d3aedf47b0 /lib | |
parent | a3bd06a5e6cf07854dd757dd97c5a0292f8ea0a3 (diff) | |
download | android-node-v8-198eb9c5d6ac6a90dadb8c58396f9b35eaf6f5ce.tar.gz android-node-v8-198eb9c5d6ac6a90dadb8c58396f9b35eaf6f5ce.tar.bz2 android-node-v8-198eb9c5d6ac6a90dadb8c58396f9b35eaf6f5ce.zip |
timers: reschedule interval even if it threw
To match browser behaviour, intervals should continue being
scheduled even if the user callback threw during execution.
PR-URL: https://github.com/nodejs/node/pull/20002
Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/timers.js | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/lib/timers.js b/lib/timers.js index 15700f5a12..30bffb432a 100644 --- a/lib/timers.js +++ b/lib/timers.js @@ -285,15 +285,18 @@ function tryOnTimeout(timer, start) { var threw = true; if (timerAsyncId !== null) emitBefore(timerAsyncId, timer[trigger_async_id_symbol]); + if (start === undefined && timer._repeat) + start = TimerWrap.now(); try { - ontimeout(timer, start); + ontimeout(timer); threw = false; } finally { if (timerAsyncId !== null) { if (!threw) emitAfter(timerAsyncId); - if ((threw || !timer._repeat) && destroyHooksExist() && - !timer._destroyed) { + if (timer._repeat) { + rearm(timer, start); + } else if (destroyHooksExist() && !timer._destroyed) { emitDestroy(timerAsyncId); timer._destroyed = true; } @@ -417,18 +420,14 @@ setTimeout[internalUtil.promisify.custom] = function(after, value) { exports.setTimeout = setTimeout; -function ontimeout(timer, start) { +function ontimeout(timer) { const args = timer._timerArgs; if (typeof timer._onTimeout !== 'function') return promiseResolve(timer._onTimeout, args[0]); - if (start === undefined && timer._repeat) - start = TimerWrap.now(); if (!args) timer._onTimeout(); else Reflect.apply(timer._onTimeout, timer, args); - if (timer._repeat) - rearm(timer, start); } function rearm(timer, start = TimerWrap.now()) { |