Skip to content

Commit 1e2581e

Browse files
fix(node/timers/promises): add scheduler APIs (#24802)
This PR adds the experimental `scheduler` APIs in Node's `timers/promises` module. See https://nodejs.org/api/timers.html#timerspromisesschedulerwaitdelay-options Fixes #24800
1 parent cd59fc5 commit 1e2581e

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

ext/node/polyfills/timers/promises.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@ export const setTimeout = promisify(timers.setTimeout),
66
setImmediate = promisify(timers.setImmediate),
77
setInterval = promisify(timers.setInterval);
88

9+
export const scheduler = {
10+
async wait(delay: number, options?: { signal?: AbortSignal }): Promise<void> {
11+
return await setTimeout(delay, undefined, options);
12+
},
13+
yield: setImmediate,
14+
};
15+
916
export default {
1017
setTimeout,
1118
setImmediate,

tests/unit_node/timers_test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,29 @@ Deno.test("[node/timers/promises setTimeout]", () => {
6666
return p;
6767
});
6868

69+
Deno.test("[node/timers/promises scheduler.wait]", async () => {
70+
const { scheduler } = timersPromises;
71+
let resolved = false;
72+
timers.setTimeout(() => (resolved = true), 20);
73+
const p = scheduler.wait(20);
74+
75+
assert(p instanceof Promise);
76+
await p;
77+
assert(resolved);
78+
});
79+
80+
Deno.test("[node/timers/promises scheduler.yield]", async () => {
81+
const { scheduler } = timersPromises;
82+
let resolved = false;
83+
timers.setImmediate(() => resolved = true);
84+
85+
const p = scheduler.yield();
86+
assert(p instanceof Promise);
87+
await p;
88+
89+
assert(resolved);
90+
});
91+
6992
// Regression test for https://github.com/denoland/deno/issues/17981
7093
Deno.test("[node/timers refresh cancelled timer]", () => {
7194
const { setTimeout, clearTimeout } = timers;

0 commit comments

Comments
 (0)