1'use strict'; 2 3const common = require('../common'); 4const assert = require('assert'); 5 6const rejection = new Error('Swallowed reject'); 7const rejection2 = new TypeError('Weird'); 8const resolveMessage = 'First call'; 9const rejectPromise = new Promise((r) => setTimeout(r, 10, rejection2)); 10const swallowedResolve = 'Swallowed resolve'; 11const swallowedResolve2 = 'Foobar'; 12 13process.on('multipleResolves', common.mustCall(handler, 4)); 14 15const p1 = new Promise((resolve, reject) => { 16 resolve(resolveMessage); 17 resolve(swallowedResolve); 18 reject(rejection); 19}); 20 21const p2 = new Promise((resolve, reject) => { 22 reject(rejectPromise); 23 resolve(swallowedResolve2); 24 reject(rejection2); 25}).catch(common.mustCall((exception) => { 26 assert.strictEqual(exception, rejectPromise); 27})); 28 29const expected = [ 30 'resolve', 31 p1, 32 swallowedResolve, 33 'reject', 34 p1, 35 rejection, 36 'resolve', 37 p2, 38 swallowedResolve2, 39 'reject', 40 p2, 41 rejection2, 42]; 43 44let count = 0; 45 46function handler(type, promise, reason) { 47 assert.strictEqual(type, expected.shift()); 48 // In the first two cases the promise is identical because it's not delayed. 49 // The other two cases are not identical, because the `promise` is caught in a 50 // state when it has no knowledge about the `.catch()` handler that is 51 // attached to it right afterwards. 52 if (count++ < 2) { 53 assert.strictEqual(promise, expected.shift()); 54 } else { 55 assert.notStrictEqual(promise, expected.shift()); 56 } 57 assert.strictEqual(reason, expected.shift()); 58} 59