2018-01-13 22:51:28 +01:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
const common = require('../common');
|
2018-05-23 00:01:53 +02:00
|
|
|
const assert = require('assert');
|
|
|
|
|
|
|
|
const immediate = setImmediate(() => {});
|
|
|
|
assert.strictEqual(immediate.hasRef(), true);
|
|
|
|
immediate.unref();
|
|
|
|
assert.strictEqual(immediate.hasRef(), false);
|
|
|
|
clearImmediate(immediate);
|
|
|
|
|
2018-01-13 22:51:28 +01:00
|
|
|
// 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() {
|
|
|
|
// Unrefed setImmediate executes if it was unrefed but something else keeps
|
|
|
|
// the loop open
|
2020-03-22 01:49:45 +01:00
|
|
|
setImmediate(common.mustCall()).unref();
|
|
|
|
setTimeout(common.mustCall(() => { setImmediate(secondStep); }), 0);
|
2018-01-13 22:51:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
function secondStep() {
|
|
|
|
// clearImmediate works just fine with unref'd immediates
|
|
|
|
const immA = setImmediate(() => {
|
|
|
|
clearImmediate(immA);
|
|
|
|
clearImmediate(immB);
|
2018-12-10 13:27:32 +01:00
|
|
|
// This should not keep the event loop open indefinitely
|
2018-01-13 22:51:28 +01:00
|
|
|
// 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();
|
|
|
|
}
|