mirror of
https://github.com/nodejs/node.git
synced 2025-05-10 17:57:53 +00:00

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>
46 lines
1.4 KiB
JavaScript
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();
|
|
}
|