Fix withTimeout helper function

This commit is contained in:
Edoardo Pirovano 2022-10-11 10:04:21 +01:00
parent c6c7d293ca
commit 6e1dab28b6
No known key found for this signature in database
GPG key ID: 047556B5D93FFE28
6 changed files with 48 additions and 6 deletions

View file

@ -632,3 +632,18 @@ test("withTimeout on short task", async (t) => {
t.deepEqual(shortTaskTimedOut, false);
t.deepEqual(result, 99);
});
test("withTimeout doesn't call callback if promise resolves", async (t) => {
let shortTaskTimedOut = false;
const shortTask = new Promise((resolve) => {
setTimeout(() => {
resolve(99);
}, shortTime);
});
const result = await util.withTimeout(100, shortTask, () => {
shortTaskTimedOut = true;
});
await new Promise((r) => setTimeout(r, 200));
t.deepEqual(shortTaskTimedOut, false);
t.deepEqual(result, 99);
});

View file

@ -909,12 +909,18 @@ export async function withTimeout<T>(
promise: Promise<T>,
onTimeout: () => void
): Promise<T | undefined> {
let finished = false;
const mainTask = async () => {
const result = await promise;
finished = true;
return result;
};
const timeout: Promise<undefined> = new Promise((resolve) => {
setTimeout(() => {
onTimeout();
if (!finished) onTimeout();
resolve(undefined);
}, timeoutMs);
});
return await Promise.race([promise, timeout]);
return await Promise.race([mainTask(), timeout]);
}