Skip to content

Commit 2054cb7

Browse files
committed
Add bindings to Promise.allSettled
Resolves #5923 Signed-Off-By: Hyeseong Kim <hey@hyeseong.kim>
1 parent a84406a commit 2054cb7

File tree

4 files changed

+96
-1
lines changed

4 files changed

+96
-1
lines changed

jscomp/others/js_promise2.res

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
type t<+'a> = promise<'a>
22
type error
33

4+
@tag("status")
5+
type settledResult<+'a> =
6+
| @as("fulfilled") Fulfilled({value: 'a}) | @as("rejected") Rejected({reason: unknown})
7+
48
/** Type-safe t-first then */
59
let then: (promise<'a>, 'a => promise<'b>) => promise<'b> = %raw(`
610
function(p, cont) {
@@ -52,6 +56,53 @@ external all6: (
5256
(promise<'a0>, promise<'a1>, promise<'a2>, promise<'a3>, promise<'a4>, promise<'a5>)
5357
) => promise<('a0, 'a1, 'a2, 'a3, 'a4, 'a5)> = "all"
5458

59+
@val @scope("Promise")
60+
external allSettled: array<promise<'a>> => promise<array<settledResult<'a>>> = "allSettled"
61+
62+
@val @scope("Promise")
63+
external allSettled2: ((promise<'a0>, promise<'a1>)) => promise<(
64+
settledResult<'a0>,
65+
settledResult<'a1>,
66+
)> = "allSettled"
67+
68+
@val @scope("Promise")
69+
external allSettled3: ((promise<'a0>, promise<'a1>, promise<'a2>)) => promise<(
70+
settledResult<'a0>,
71+
settledResult<'a1>,
72+
settledResult<'a2>,
73+
)> = "allSettled"
74+
75+
@val @scope("Promise")
76+
external allSettled4: ((promise<'a0>, promise<'a1>, promise<'a2>, promise<'a3>)) => promise<(
77+
settledResult<'a0>,
78+
settledResult<'a1>,
79+
settledResult<'a2>,
80+
settledResult<'a3>,
81+
)> = "allSettled"
82+
83+
@val @scope("Promise")
84+
external allSettled5: (
85+
(promise<'a0>, promise<'a1>, promise<'a2>, promise<'a3>, promise<'a4>)
86+
) => promise<(
87+
settledResult<'a0>,
88+
settledResult<'a1>,
89+
settledResult<'a2>,
90+
settledResult<'a3>,
91+
settledResult<'a4>,
92+
)> = "allSettled"
93+
94+
@val @scope("Promise")
95+
external allSettled6: (
96+
(promise<'a0>, promise<'a1>, promise<'a2>, promise<'a3>, promise<'a4>, promise<'a5>)
97+
) => promise<(
98+
settledResult<'a0>,
99+
settledResult<'a1>,
100+
settledResult<'a2>,
101+
settledResult<'a3>,
102+
settledResult<'a4>,
103+
settledResult<'a5>,
104+
)> = "allSettled"
105+
55106
@val @scope("Promise") external race: array<promise<'a>> => promise<'a> = "race"
56107

57108
external unsafe_async: 'a => promise<'a> = "%identity"

jscomp/test/build.ninja

Lines changed: 2 additions & 1 deletion
Large diffs are not rendered by default.

jscomp/test/test_promise.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
'use strict';
2+
3+
4+
var p1 = new Promise((function (resolve, reject) {
5+
resolve(1);
6+
}));
7+
8+
var p2 = new Promise((function (resolve, reject) {
9+
resolve("foo");
10+
}));
11+
12+
var match = await Promise.allSettled([
13+
p1,
14+
p2
15+
]);
16+
17+
var match$1 = match[0];
18+
19+
if (match$1.status === "fulfilled") {
20+
var match$2 = match[1];
21+
if (match$2.status === "fulfilled") {
22+
console.log(match$1.value, match$2.value);
23+
} else {
24+
console.log("second rejected", match$2.reason);
25+
}
26+
} else if (match[1].status === "fulfilled") {
27+
console.log("first rejected", match$1.reason);
28+
} else {
29+
console.log("both rejected");
30+
}
31+
32+
exports.p1 = p1;
33+
exports.p2 = p2;
34+
/* p1 Not a pure module */

jscomp/test/test_promise.res

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
let p1 = Js.Promise2.make((~resolve, ~reject) => resolve(1))
2+
let p2 = Js.Promise2.make((~resolve, ~reject) => resolve("foo"))
3+
4+
switch await Js.Promise2.allSettled2((p1, p2)) {
5+
| (Fulfilled({value: v1}), Fulfilled({value: v2})) => Js.log2(v1, v2)
6+
| (Rejected({reason}), Fulfilled(_)) => Js.log2("first rejected", reason)
7+
| (Fulfilled(_), Rejected({reason})) => Js.log2("second rejected", reason)
8+
| _ => Js.log("both rejected")
9+
}

0 commit comments

Comments
 (0)