Skip to content
Permalink
Newer
Older
100644 36 lines (27 sloc) 1.28 KB
Ignoring revisions in .git-blame-ignore-revs.
1
'use strict';
2
3
var GetIntrinsic = require('get-intrinsic');
4
5
var $TypeError = GetIntrinsic('%TypeError%');
6
7
var IsCallable = require('es-abstract/2022/IsCallable');
8
var IsConstructor = require('es-abstract/2022/IsConstructor');
9
10
// https://262.ecma-international.org/6.0/#sec-newpromisecapability
11
12
module.exports = function NewPromiseCapability(C) {
13
if (!IsConstructor(C)) {
14
throw new $TypeError('C must be a constructor'); // step 1
15
}
16
17
var resolvingFunctions = { '[[Resolve]]': void undefined, '[[Reject]]': void undefined }; // step 3
18
19
var promise = new C(function (resolve, reject) { // steps 4-5
20
if (typeof resolvingFunctions['[[Resolve]]'] !== 'undefined' || typeof resolvingFunctions['[[Reject]]'] !== 'undefined') {
21
throw new $TypeError('executor has already been called'); // step 4.a, 4.b
22
}
23
resolvingFunctions['[[Resolve]]'] = resolve; // step 4.c
24
resolvingFunctions['[[Reject]]'] = reject; // step 4.d
25
}); // step 4-6
26
27
if (!IsCallable(resolvingFunctions['[[Resolve]]']) || !IsCallable(resolvingFunctions['[[Reject]]'])) {
28
throw new $TypeError('executor must provide valid resolve and reject functions'); // steps 7-8
29
}
30
31
return {
32
'[[Promise]]': promise,
33
'[[Resolve]]': resolvingFunctions['[[Resolve]]'],
34
'[[Reject]]': resolvingFunctions['[[Reject]]']
35
}; // step 9
36
};