0
0
mirror of https://github.com/nodejs/node.git synced 2024-11-29 23:16:30 +01:00
nodejs/test/parallel/test-timers-immediate-unref.js
Anatoli Papirovski c1234673bb
timers: allow Immediates to be unrefed
Refactor Immediates handling to allow for them to be unrefed, similar
to setTimeout, but without extra handles.

Document the new `immediate.ref()` and `immediate.unref()` methods.

Add SetImmediateUnref on the C++ side.

PR-URL: https://github.com/nodejs/node/pull/18139
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
2018-01-18 15:55:59 -05:00

38 lines
1.2 KiB
JavaScript

'use strict';
const common = require('../common');
const Countdown = require('../common/countdown');
// 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();
}