diff --git a/src/platform_impl/web/async/waker.rs b/src/platform_impl/web/async/waker.rs index 3df8dd1707..bac164afce 100644 --- a/src/platform_impl/web/async/waker.rs +++ b/src/platform_impl/web/async/waker.rs @@ -83,6 +83,16 @@ impl WakerSpawner { pub fn waker(&self) -> Waker { Waker(self.0.clone()) } + + pub fn fetch(&self) -> usize { + debug_assert!( + self.0.is_main_thread(), + "this should only be called from the main thread" + ); + + self.0 + .with_sender_data(|inner| inner.0.counter.swap(0, Ordering::Relaxed)) + } } impl Drop for WakerSpawner { diff --git a/src/platform_impl/web/event_loop/runner.rs b/src/platform_impl/web/event_loop/runner.rs index 2018ba171d..0d8e056666 100644 --- a/src/platform_impl/web/event_loop/runner.rs +++ b/src/platform_impl/web/event_loop/runner.rs @@ -631,7 +631,18 @@ impl Shared { if !is_closed && self.0.runner.borrow().maybe_runner().is_some() { // Take an event out of the queue and handle it // Make sure not to let the borrow_mut live during the next handle_event - let event = { self.0.events.borrow_mut().pop_front() }; + let event = { + let mut events = self.0.events.borrow_mut(); + + // Pre-fetch `UserEvent`s to avoid having to wait until the next event loop cycle. + events.extend( + iter::repeat(Event::UserEvent(())) + .take(self.0.proxy_spawner.fetch()) + .map(EventWrapper::from), + ); + + events.pop_front() + }; if let Some(event) = event { self.handle_event(event); }