Skip to content

Commit d24a11a

Browse files
author
Alexander Borisov
committed
Added remaining Promise constructor methods.
The following methods were added: Promise.all(), Promise.allSettled(), Promise.any(), Promise.race().
1 parent 3e8c943 commit d24a11a

10 files changed

+710
-0
lines changed

src/njs_promise.c

Lines changed: 599 additions & 0 deletions
Large diffs are not rendered by default.

test/js/promise_all.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
function resolve(value) {
2+
return new Promise(resolve => setTimeout(() => resolve(value), 0));
3+
}
4+
5+
Promise.all([resolve(['one', 'two']), resolve(['three', 'four'])])
6+
.then(
7+
(v) => {console.log(`resolved:${njs.dump(v)}`)},
8+
(v) => {console.log(`rejected:${njs.dump(v)}`)}
9+
);

test/js/promise_allSettled.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
var p0 = Promise.resolve(2).then(v => v + 1);
2+
var p1 = Promise.reject(21).catch(v => v * 2);
3+
var p2 = Promise.resolve('nope').then(() => { throw 'foo' });
4+
var p3 = Promise.reject('yes').then(() => { throw 'nope'; });
5+
var p4 = Promise.resolve('here').finally(() => 'nope');
6+
var p5 = Promise.reject('here too').finally(() => 'nope');
7+
var p6 = Promise.resolve('nope').finally(() => { throw 'finally'; });
8+
var p7 = Promise.reject('nope').finally(() => { throw 'finally after rejected'; });
9+
var p8 = Promise.reject(1).then(() => 'nope', () => 0);
10+
11+
function dump(v) {
12+
var fulfilled = v.filter(v=>v.status == 'fulfilled').map(v=>v.value).sort();
13+
var rejected = v.filter(v=>v.status == 'rejected').map(v=>v.reason).sort();
14+
return `F:${fulfilled}|R:${rejected}`
15+
}
16+
17+
Promise.allSettled([p0, p1, p2, p3, p4, p5, p6, p7, p8]).then(
18+
(v) => {console.log(`resolved:${dump(v)}`)},
19+
(v) => {console.log(`rejected:${dump(v)}`)}
20+
);
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
function dump(v) {
2+
var fulfilled = v.filter(v=>v.status == 'fulfilled').map(v=>v.value).sort();
3+
var rejected = v.filter(v=>v.status == 'rejected').map(v=>v.reason).sort();
4+
return `F:${fulfilled}|R:${rejected}`;
5+
}
6+
7+
Promise.allSettled("abc").then(
8+
(v) => {console.log(`resolved:${dump(v)}`)},
9+
(v) => {console.log(`rejected:${dump(v)}`)}
10+
);

test/js/promise_all_throw.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
var p0 = Promise.resolve(1).then(v => v + 1);
2+
var p1 = Promise.reject(2).catch(v => v * 2);
3+
var p2 = Promise.resolve().then(() => { throw 'foo' });
4+
var p3 = Promise.reject().then(() => { throw 'oof'; });
5+
6+
Promise.all([p0, p1, p2, p3]).then(
7+
(v) => {console.log(`resolved:${v}`)},
8+
(v) => {console.log(`rejected:${v}`)}
9+
);

test/js/promise_any.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
var p0 = Promise.resolve().then(() => { throw 'foo' });
2+
var p1 = Promise.reject(2).catch(v => v * 2);
3+
var p2 = Promise.resolve(1).then(v => v + 1);
4+
5+
Promise.any([p0, p1, p2]).then(
6+
(v) => {console.log(`resolved:${v}`)},
7+
(v) => {console.log(`rejected:${v}`)}
8+
);
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
var p0 = Promise.reject(1);
2+
var p1 = Promise.reject(2);
3+
4+
Promise.any([p0, p1]).then(
5+
(v) => {console.log(`resolve:${v}`)},
6+
(v) => {console.log(`reject:${v}`)}
7+
);

test/js/promise_race.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
var p1 = new Promise((resolve, reject) => {
2+
setTimeout(resolve, 0, 'one');
3+
});
4+
5+
var p2 = new Promise((resolve, reject) => {
6+
setTimeout(resolve, 0, 'two');
7+
});
8+
9+
Promise.race([p1, p2]).then(
10+
(v) => {console.log(`resolved:${v}`)},
11+
(v) => {console.log(`rejected:${v}`)}
12+
);

test/js/promise_race_throw.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
var p1 = new Promise((resolve, reject) => {
2+
throw 'one';
3+
});
4+
5+
var p2 = new Promise((resolve, reject) => {
6+
setTimeout(resolve, 0, 'two');
7+
});
8+
9+
Promise.race([p1, p2]).then(
10+
(v) => {console.log(`resolved:${v}`)},
11+
(v) => {console.log(`rejected:${v}`)}
12+
);

test/njs_expect_test.exp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,3 +1084,27 @@ njs_run {"./test/js/promise_reject_catch.js"} \
10841084

10851085
njs_run {"./test/js/promise_reject_post_catch.js"} \
10861086
"Error: unhandled promise rejection: undefined"
1087+
1088+
njs_run {"./test/js/promise_all.js"} \
1089+
"resolved:\\\[\\\['one','two'],\\\['three','four']]"
1090+
1091+
njs_run {"./test/js/promise_all_throw.js"} \
1092+
"rejected:foo"
1093+
1094+
njs_run {"./test/js/promise_allSettled.js"} \
1095+
"resolved:resolved:F:0,3,42,here|R:finally,finally after rejected,foo,here too,yes"
1096+
1097+
njs_run {"./test/js/promise_allSettled_string.js"} \
1098+
"resolved:F:a,b,c|R:"
1099+
1100+
njs_run {"./test/js/promise_any.js"} \
1101+
"resolved:4"
1102+
1103+
njs_run {"./test/js/promise_any_all_rejected.js"} \
1104+
"reject:AggregateError: All promises were rejected"
1105+
1106+
njs_run {"./test/js/promise_race.js"} \
1107+
"resolved:one"
1108+
1109+
njs_run {"./test/js/promise_race_throw.js"} \
1110+
"rejected:one"

0 commit comments

Comments
 (0)