node/test/parallel/test-timers-immediate-unref.js
Anatoli Papirovski 48a2568f41
timers: add hasRef method to Timeout & Immediate
Provide a way to check whether the current timer or immediate is refed.

PR-URL: https://github.com/nodejs/node/pull/20898
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Tiancheng "Timothy" Gu <timothygu99@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
2018-06-01 10:29:51 +02:00

46 lines
1.4 KiB
JavaScript

'use strict';
const common = require('../common');
const Countdown = require('../common/countdown');
const assert = require('assert');
const immediate = setImmediate(() => {});
assert.strictEqual(immediate.hasRef(), true);
immediate.unref();
assert.strictEqual(immediate.hasRef(), false);
clearImmediate(immediate);
// This immediate should execute as it was unrefed and refed again.
// It also confirms that unref/ref are chainable.
setImmediate(common.mustCall(firstStep)).ref().unref().unref().ref();
function firstStep() {
const countdown =
new Countdown(2, common.mustCall(() => setImmediate(secondStep)));
// Unrefed setImmediate executes if it was unrefed but something else keeps
// the loop open
setImmediate(() => countdown.dec()).unref();
setTimeout(() => countdown.dec(), 50);
}
function secondStep() {
// clearImmediate works just fine with unref'd immediates
const immA = setImmediate(() => {
clearImmediate(immA);
clearImmediate(immB);
// this should not keep the event loop open indefinitely
// or do anything else weird
immA.ref();
immB.ref();
}).unref();
const immB = setImmediate(common.mustNotCall()).unref();
setImmediate(common.mustCall(finalStep));
}
function finalStep() {
// This immediate should not execute as it was unrefed
// and nothing else is keeping the event loop alive
setImmediate(common.mustNotCall()).unref();
}