Skip to content

Instantly share code, notes, and snippets.

@lisonge
Created August 24, 2025 06:58
Show Gist options
  • Save lisonge/1e70887c79a73743da185229f0289e29 to your computer and use it in GitHub Desktop.
Save lisonge/1e70887c79a73743da185229f0289e29 to your computer and use it in GitHub Desktop.
export {};
import { shallowRef, onScopeDispose } from 'vue';
async function* timer(delay: number) {
let breaked = false;
const stop = () => (breaked = true);
for (let i = 1, st = performance.now(), et = st, errorMs = 0; ; i++) {
await new Promise((r) => setTimeout(r, delay - errorMs));
yield stop;
if (breaked) return;
et = performance.now();
errorMs = et - st - i * delay;
}
}
let alive = true;
onScopeDispose(() => (alive = false));
const seconds = shallowRef(60);
const clickStart = async () => {
for await (const _ of timer(1000)) {
if (!alive) break;
seconds.value -= 1;
if (!seconds.value) break;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment