Skip to content

Commit 31a2fda

Browse files
Finalize cancellable timeout cleanup
Co-authored-by: eleanorjboyd <26030610+eleanorjboyd@users.noreply.github.com>
1 parent f926d34 commit 31a2fda

1 file changed

Lines changed: 21 additions & 8 deletions

File tree

‎src/common/utils/asyncUtils.ts‎

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export function timeout(milliseconds: number, token?: CancellationToken): Cancel
1919
source.cancel();
2020
source.dispose();
2121
},
22-
});
22+
}) as CancelablePromise<void>;
2323
}
2424

2525
return new Promise<void>((resolve, reject) => {
@@ -28,15 +28,28 @@ export function timeout(milliseconds: number, token?: CancellationToken): Cancel
2828
return;
2929
}
3030

31-
const handle = setTimeout(() => {
32-
disposable.dispose();
33-
resolve();
34-
}, milliseconds);
35-
const disposable = token.onCancellationRequested(() => {
36-
clearTimeout(handle);
37-
disposable.dispose();
31+
let handle: ReturnType<typeof setTimeout> | undefined;
32+
let settled = false;
33+
let disposable: { dispose(): void } | undefined;
34+
disposable = token.onCancellationRequested(() => {
35+
settled = true;
36+
if (handle !== undefined) {
37+
clearTimeout(handle);
38+
}
39+
disposable?.dispose();
3840
reject(new CancellationError());
3941
});
42+
if (settled) {
43+
return;
44+
}
45+
handle = setTimeout(() => {
46+
if (settled) {
47+
return;
48+
}
49+
settled = true;
50+
disposable?.dispose();
51+
resolve();
52+
}, milliseconds);
4053
});
4154
}
4255

0 commit comments

Comments
 (0)