mirror of
https://github.com/AtHeartEngineering/lodestar.git
synced 2026-01-09 20:18:04 -05:00
sleep(0) must yield event loop (#3987)
This commit is contained in:
@@ -6,7 +6,7 @@ import {ErrorAborted} from "./errors";
|
||||
* On abort throws ErrorAborted
|
||||
*/
|
||||
export async function sleep(ms: number, signal?: AbortSignal): Promise<void> {
|
||||
if (ms <= 0) {
|
||||
if (ms < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -29,6 +29,41 @@ describe("sleep", function () {
|
||||
controller.abort();
|
||||
expect(controller.signal.aborted, "Signal should already be aborted").to.be.true;
|
||||
|
||||
await expect(sleep(10, controller.signal)).to.rejectedWith(ErrorAborted);
|
||||
await expect(sleep(0, controller.signal)).to.rejectedWith(ErrorAborted);
|
||||
});
|
||||
|
||||
it("sleep 0 must tick the event loop", async () => {
|
||||
enum Step {
|
||||
beforeSleep = "beforeSleep",
|
||||
afterSleep = "afterSleep",
|
||||
setTimeout0 = "setTimeout0",
|
||||
}
|
||||
|
||||
const steps: Step[] = [];
|
||||
|
||||
setTimeout(() => {
|
||||
steps.push(Step.setTimeout0);
|
||||
}, 0);
|
||||
|
||||
steps.push(Step.beforeSleep);
|
||||
await sleep(0);
|
||||
steps.push(Step.afterSleep);
|
||||
|
||||
// Manual sleep to wait 2 ticks
|
||||
for (let i = 0; i < 2; i++) {
|
||||
await new Promise((r) => setTimeout(r, 0));
|
||||
}
|
||||
|
||||
expect(steps).to.deep.equal(
|
||||
[
|
||||
// Sync execution
|
||||
Step.beforeSleep,
|
||||
// Next tick, first registered callback
|
||||
Step.setTimeout0,
|
||||
// Next tick, second registered callback
|
||||
Step.afterSleep,
|
||||
],
|
||||
"Wrong steps"
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user