blob: 5364d923d0d300e22f1135941f5d2492403e33c7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
// Faster setTimeout(fn, 0) implementation using postMessage API
// Based on https://dbaron.org/log/20100309-faster-timeouts
export type IMicroTaskCallback = () => void;
export class MicroTaskScheduler {
readonly messageName = 'zero-timeout-message';
private executionQueue: Array<IMicroTaskCallback> = [];
private stopped = true;
start() {
if (this.stopped) {
this.stopped = false;
window.addEventListener('message', this.handleMessage, true);
}
}
stop() {
this.stopped = true;
window.removeEventListener('message', this.handleMessage, true);
}
postTask(fn: IMicroTaskCallback) {
if (!this.stopped) {
this.executionQueue.push(fn);
window.postMessage(this.messageName, '*');
}
}
private handleMessage = (event: MessageEvent) => {
if (event.data === this.messageName) {
event.stopPropagation();
const executeJob = this.executionQueue.shift();
if (executeJob !== undefined) {
executeJob();
}
}
};
}
|