'use strict'; const common = require('../common'); const assert = require('assert'); const { promiseHooks } = require('v8'); assert.throws(() => { promiseHooks.onSettled(async function() { }); }, /The "settledHook" argument must be of type function/); assert.throws(() => { promiseHooks.onSettled(async function*() { }); }, /The "settledHook" argument must be of type function/); let seen; const stop = promiseHooks.onSettled(common.mustCall((promise) => { seen = promise; }, 4)); // Constructor resolve triggers hook const promise = new Promise((resolve, reject) => { assert.strictEqual(seen, undefined); setImmediate(() => { resolve(); assert.strictEqual(seen, promise); seen = undefined; constructorReject(); }); }); // Constructor reject triggers hook function constructorReject() { const promise = new Promise((resolve, reject) => { assert.strictEqual(seen, undefined); setImmediate(() => { reject(); assert.strictEqual(seen, promise); seen = undefined; simpleResolveReject(); }); }); promise.catch(() => {}); } // Sync resolve/reject helpers trigger hook function simpleResolveReject() { const resolved = Promise.resolve(); assert.strictEqual(seen, resolved); seen = undefined; const rejected = Promise.reject(); assert.strictEqual(seen, rejected); seen = undefined; stop(); rejected.catch(() => {}); }