Skip to content

Commit e1663bd

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

File tree

4 files changed

+97
-1
lines changed

4 files changed

+97
-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: 35 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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)