Skip to content

Commit 7782c0c

Browse files
committed
Proposal await dictionary allSettledKeyed method
1 parent 426fa83 commit 7782c0c

File tree

17 files changed

+425
-1
lines changed

17 files changed

+425
-1
lines changed

docs/web/docs/features/proposals/await-dictionary.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,26 @@
33
[Proposal repo](https://github.com/tc39/proposal-await-dictionary)
44

55
## Modules
6-
[`esnext.promise.all-keyed`](https://github.com/zloirock/core-js/blob/v4/packages/core-js/modules/esnext.promise.all-keyed.js)
6+
[`esnext.promise.all-keyed`](https://github.com/zloirock/core-js/blob/v4/packages/core-js/modules/esnext.promise.all-keyed.js), [`esnext.promise.all-settled-keyed`](https://github.com/zloirock/core-js/blob/v4/packages/core-js/modules/esnext.promise.all-settled-keyed.js)
77

88
## Built-ins signatures
99
```ts
1010
class Promise {
1111
allKeyed<T extends Record<string, unknown>>(
1212
obj: T
1313
): Promise<{ [K in keyof T]: Awaited<T[K]> }>;
14+
15+
allSettledKeyed<T extends Record<string, unknown>>(
16+
obj: T
17+
): Promise<{ [K in keyof T]: PromiseSettledResult<Awaited<T[K]>> }>;
1418
}
1519
```
1620

1721
## [Entry points]({docs-version}/docs/usage#h-entry-points)
1822
```ts
1923
core-js/proposals/promise-all-keyed
2024
core-js(-pure)/full/promise/all-keyed
25+
core-js(-pure)/full/promise/all-settled-keyed
2126
```
2227

2328
## Examples
@@ -27,4 +32,10 @@ await Promise.allKeyed({
2732
b: Promise.resolve(2),
2833
c: 3,
2934
}); // => { a: 1, b: 2, c: 3 }
35+
36+
await Promise.allSettledKeyed({
37+
a: Promise.resolve(1),
38+
b: Promise.reject(2),
39+
c: 3,
40+
}); // => { a: { status: "fulfilled", value: 1 }, b: { status: "rejected", reasone: 2 }, c: { status: "fulfilled", value: 3 } }
3041
```

packages/core-js-compat/src/built-in-definitions.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ export const StaticProperties = {
154154
all: 'promise/all',
155155
allKeyed: 'promise/all-keyed',
156156
allSettled: 'promise/all-settled',
157+
allSettledKeyed: 'promise/all-settled-keyed',
157158
any: 'promise/any',
158159
race: 'promise/race',
159160
try: 'promise/try',

packages/core-js-compat/src/data.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2391,6 +2391,8 @@ export const data = {
23912391
},
23922392
'esnext.promise.all-keyed': {
23932393
},
2394+
'esnext.promise.all-settled-keyed': {
2395+
},
23942396
'esnext.set.from': {
23952397
},
23962398
'esnext.set.of': {
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
'use strict';
2+
var $ = require('../internals/export');
3+
var aCallable = require('../internals/a-callable');
4+
var anObject = require('../internals/an-object');
5+
var call = require('../internals/function-call');
6+
var createProperty = require('../internals/create-property');
7+
var getBuiltInStaticMethod = require('../internals/get-built-in-static-method');
8+
var getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor');
9+
var newPromiseCapabilityModule = require('../internals/new-promise-capability');
10+
var perform = require('../internals/perform');
11+
var uncurryThis = require('../internals/function-uncurry-this');
12+
13+
var create = Object.create;
14+
var forEach = uncurryThis([].forEach);
15+
// dependency: es.reflect.own-keys
16+
var ownKeys = getBuiltInStaticMethod('Reflect', 'ownKeys');
17+
18+
// `Promise.allSettledKeyed` method
19+
// https://tc39.es/proposal-await-dictionary
20+
$({ target: 'Promise', stat: true, forced: true }, {
21+
allSettledKeyed: function allSettledKeyed(promises) {
22+
var C = this;
23+
// dependency: es.promise.constructor
24+
// dependency: es.promise.catch
25+
// dependency: es.promise.finally
26+
// dependency: es.promise.resolve
27+
var capability = newPromiseCapabilityModule.f(C);
28+
var resolve = capability.resolve;
29+
var reject = capability.reject;
30+
var result = perform(function () {
31+
var wrapResolve = function () {
32+
var res = create(null);
33+
forEach(keys, function (k, idx) {
34+
createProperty(res, k, values[idx]);
35+
});
36+
resolve(res);
37+
};
38+
var promiseResolve = aCallable(C.resolve);
39+
var allKeys = ownKeys(anObject(promises));
40+
var keys = [];
41+
var values = [];
42+
var remaining = 1;
43+
var counter = 0;
44+
forEach(allKeys, function (key) {
45+
var desc = getOwnPropertyDescriptor.f(promises, key);
46+
if (desc && desc.enumerable) {
47+
var index = counter;
48+
var alreadyCalled = false;
49+
remaining++;
50+
keys[index] = key;
51+
values[index] = undefined;
52+
call(promiseResolve, C, promises[key]).then(function (value) {
53+
if (alreadyCalled) return;
54+
alreadyCalled = true;
55+
values[index] = { status: 'fulfilled', value: value };
56+
--remaining || wrapResolve();
57+
}, function (error) {
58+
if (alreadyCalled) return;
59+
alreadyCalled = true;
60+
values[index] = { status: 'rejected', reason: error };
61+
--remaining || wrapResolve();
62+
});
63+
counter++;
64+
}
65+
});
66+
--remaining || wrapResolve();
67+
});
68+
if (result.error) reject(result.value);
69+
return capability.promise;
70+
},
71+
});

scripts/build-entries/entries-definitions.mjs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1929,6 +1929,12 @@ export const features = {
19291929
namespace: 'Promise',
19301930
name: 'allSettled',
19311931
},
1932+
'promise/all-settled-keyed': {
1933+
modules: ['esnext.promise.all-settled-keyed'],
1934+
template: $staticWithContext,
1935+
namespace: 'Promise',
1936+
name: 'allSettledKeyed',
1937+
},
19321938
'promise/any': {
19331939
modules: ['es.promise.any'],
19341940
template: $staticWithContext,
@@ -3541,6 +3547,7 @@ export const proposals = {
35413547
stage: 1,
35423548
modules: [
35433549
'esnext.promise.all-keyed',
3550+
'esnext.promise.all-settled-keyed',
35443551
],
35453552
},
35463553
'promise-all-settled': {

tests/babel-plugin/fixtures/entry-global/import-full-chrome-135-v4.0/output.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import "core-js/modules/esnext.map.get-or-insert-computed";
4444
import "core-js/modules/esnext.map.of";
4545
import "core-js/modules/esnext.number.clamp";
4646
import "core-js/modules/esnext.promise.all-keyed";
47+
import "core-js/modules/esnext.promise.all-settled-keyed";
4748
import "core-js/modules/esnext.set.from";
4849
import "core-js/modules/esnext.set.of";
4950
import "core-js/modules/esnext.string.cooked";

tests/babel-plugin/fixtures/entry-global/import-full-chrome-135-v4.999/output.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import "core-js/modules/esnext.map.get-or-insert-computed";
4444
import "core-js/modules/esnext.map.of";
4545
import "core-js/modules/esnext.number.clamp";
4646
import "core-js/modules/esnext.promise.all-keyed";
47+
import "core-js/modules/esnext.promise.all-settled-keyed";
4748
import "core-js/modules/esnext.set.from";
4849
import "core-js/modules/esnext.set.of";
4950
import "core-js/modules/esnext.string.cooked";

tests/babel-plugin/fixtures/entry-global/import-full-ie11-v4.0/output.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,7 @@ import "core-js/modules/esnext.map.get-or-insert-computed";
313313
import "core-js/modules/esnext.map.of";
314314
import "core-js/modules/esnext.number.clamp";
315315
import "core-js/modules/esnext.promise.all-keyed";
316+
import "core-js/modules/esnext.promise.all-settled-keyed";
316317
import "core-js/modules/esnext.set.from";
317318
import "core-js/modules/esnext.set.of";
318319
import "core-js/modules/esnext.string.cooked";

tests/babel-plugin/fixtures/entry-global/import-full-ie11-v4.999/output.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,7 @@ import "core-js/modules/esnext.map.get-or-insert-computed";
313313
import "core-js/modules/esnext.map.of";
314314
import "core-js/modules/esnext.number.clamp";
315315
import "core-js/modules/esnext.promise.all-keyed";
316+
import "core-js/modules/esnext.promise.all-settled-keyed";
316317
import "core-js/modules/esnext.set.from";
317318
import "core-js/modules/esnext.set.of";
318319
import "core-js/modules/esnext.string.cooked";

tests/babel-plugin/fixtures/entry-global/require-full-chrome-135-v4.0/output.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import "core-js/modules/esnext.map.get-or-insert-computed";
4444
import "core-js/modules/esnext.map.of";
4545
import "core-js/modules/esnext.number.clamp";
4646
import "core-js/modules/esnext.promise.all-keyed";
47+
import "core-js/modules/esnext.promise.all-settled-keyed";
4748
import "core-js/modules/esnext.set.from";
4849
import "core-js/modules/esnext.set.of";
4950
import "core-js/modules/esnext.string.cooked";

0 commit comments

Comments
 (0)