summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAnatoli Papirovski <apapirovski@mac.com>2018-04-11 11:04:56 +0200
committerRuben Bridgewater <ruben@bridgewater.de>2018-04-29 16:51:05 +0200
commit198eb9c5d6ac6a90dadb8c58396f9b35eaf6f5ce (patch)
tree7d3c8b584ce126e9ac2b8cdf66eaa6d3aedf47b0 /lib
parenta3bd06a5e6cf07854dd757dd97c5a0292f8ea0a3 (diff)
downloadandroid-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.js15
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()) {