mirror of
https://github.com/nodejs/node.git
synced 2024-11-29 23:16:30 +01:00
c1234673bb
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>
38 lines
1.2 KiB
JavaScript
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();
|
|
}
|