From 69c0d99eeac8efc1749ae2a9f57d4e7447d9af81 Mon Sep 17 00:00:00 2001 From: Dylan Piercey Date: Thu, 3 Jun 2021 14:18:57 -0700 Subject: [PATCH] fix: use batching closer to Marko's for fireEvent --- src/shared.ts | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/shared.ts b/src/shared.ts index d597346..783f4f1 100644 --- a/src/shared.ts +++ b/src/shared.ts @@ -82,7 +82,31 @@ function failIfNoWindow() { } } -const setImmediate = global.setImmediate || setTimeout; +type Callback = (...args: unknown[]) => void; +const tick = + // Re-implements the same scheduler Marko 4/5 is using internally. + typeof window === "object" && typeof window.postMessage === "function" + ? (() => { + let queue: Callback[] = []; + const id = `${Math.random()}`; + window.addEventListener("message", ({ data }) => { + if (data === id) { + const callbacks = queue; + queue = []; + for (const cb of callbacks) { + cb(); + } + } + }); + + return (cb: Callback) => { + if (queue.push(cb) === 1) { + window.postMessage(id, "*"); + } + }; + })() + : (cb: Callback) => setTimeout(cb, 0); + function waitForBatchedUpdates() { - return new Promise((resolve) => setImmediate(() => setImmediate(resolve))); + return new Promise(tick); }