mirror of
https://github.com/nodejs/node.git
synced 2024-11-21 10:59:27 +00:00
83 lines
2.7 KiB
JavaScript
83 lines
2.7 KiB
JavaScript
|
'use strict';
|
||
|
const common = require('../common');
|
||
|
const assert = require('assert');
|
||
|
const { promiseHooks } = require('v8');
|
||
|
|
||
|
for (const hook of ['init', 'before', 'after', 'settled']) {
|
||
|
assert.throws(() => {
|
||
|
promiseHooks.createHook({
|
||
|
[hook]: async function() { }
|
||
|
});
|
||
|
}, new RegExp(`The "${hook}Hook" argument must be of type function`));
|
||
|
|
||
|
assert.throws(() => {
|
||
|
promiseHooks.createHook({
|
||
|
[hook]: async function*() { }
|
||
|
});
|
||
|
}, new RegExp(`The "${hook}Hook" argument must be of type function`));
|
||
|
}
|
||
|
|
||
|
let init;
|
||
|
let initParent;
|
||
|
let before;
|
||
|
let after;
|
||
|
let settled;
|
||
|
|
||
|
const stop = promiseHooks.createHook({
|
||
|
init: common.mustCall((promise, parent) => {
|
||
|
init = promise;
|
||
|
initParent = parent;
|
||
|
}, 3),
|
||
|
before: common.mustCall((promise) => {
|
||
|
before = promise;
|
||
|
}, 2),
|
||
|
after: common.mustCall((promise) => {
|
||
|
after = promise;
|
||
|
}, 1),
|
||
|
settled: common.mustCall((promise) => {
|
||
|
settled = promise;
|
||
|
}, 2)
|
||
|
});
|
||
|
|
||
|
// Clears state on each check so only the delta needs to be checked.
|
||
|
function assertState(expectedInit, expectedInitParent, expectedBefore,
|
||
|
expectedAfter, expectedSettled) {
|
||
|
assert.strictEqual(init, expectedInit);
|
||
|
assert.strictEqual(initParent, expectedInitParent);
|
||
|
assert.strictEqual(before, expectedBefore);
|
||
|
assert.strictEqual(after, expectedAfter);
|
||
|
assert.strictEqual(settled, expectedSettled);
|
||
|
init = undefined;
|
||
|
initParent = undefined;
|
||
|
before = undefined;
|
||
|
after = undefined;
|
||
|
settled = undefined;
|
||
|
}
|
||
|
|
||
|
const parent = Promise.resolve(1);
|
||
|
// After calling `Promise.resolve(...)`, the returned promise should have
|
||
|
// produced an init event with no parent and a settled event.
|
||
|
assertState(parent, undefined, undefined, undefined, parent);
|
||
|
|
||
|
const child = parent.then(() => {
|
||
|
// When a callback to `promise.then(...)` is called, the promise it resolves
|
||
|
// to should have produced a before event to mark the start of this callback.
|
||
|
assertState(undefined, undefined, child, undefined, undefined);
|
||
|
});
|
||
|
// After calling `promise.then(...)`, the returned promise should have
|
||
|
// produced an init event with a parent of the promise the `then(...)`
|
||
|
// was called on.
|
||
|
assertState(child, parent);
|
||
|
|
||
|
const grandChild = child.then(() => {
|
||
|
// Since the check for the before event in the `then(...)` call producing the
|
||
|
// `child` promise, there should have been both a before event for this
|
||
|
// promise but also settled and after events for the `child` promise.
|
||
|
assertState(undefined, undefined, grandChild, child, child);
|
||
|
stop();
|
||
|
});
|
||
|
// After calling `promise.then(...)`, the returned promise should have
|
||
|
// produced an init event with a parent of the promise the `then(...)`
|
||
|
// was called on.
|
||
|
assertState(grandChild, child);
|