4 ms·
I tried so many janky different ways that I don't quite remember how to reproduce it, but I found that setTimeout was more likely to always execute once per ani
by Ruphin 7y ago
I tried so many janky different ways that I don't quite remember how to reproduce it, but I found that setTimeout was more likely to always execute once per animationFrame, where using MessageChannel would sometimes execute more than once per frame. I guess the minimum timeout added to setTimeout makes it more likely to not hit twice between paints. The test setup I have now gets pretty clean results.
One final question would be why you have this uid system with attaching and removing event listeners? I think MessageChannels are order preserving, so you can do with a single EventListener that consumes events off a queue, or am I missing something?
```
const { port1, port2 } = new MessageChannel();
const taskQueue = [];
port2.start();
port2.addEventListener("message", () => {
taskQueue.shift()();
});
const task = () => {
return new Promise(resolve => {
taskQueue.push(resolve);
port1.postMessage(0);
});
}
```