From 47e7f2fd41ca10c495b2f8eeb7f182579804dc17 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Fri, 8 Mar 2024 16:52:03 -0800 Subject: [PATCH] Kick server futures on the client --- packages/fullstack/src/hooks/server_future.rs | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/fullstack/src/hooks/server_future.rs b/packages/fullstack/src/hooks/server_future.rs index 1194f38d5..a79d0ed0c 100644 --- a/packages/fullstack/src/hooks/server_future.rs +++ b/packages/fullstack/src/hooks/server_future.rs @@ -14,8 +14,6 @@ where let resource = use_resource(move || { async move { - // this is going to subscribe this resource to any reactivity given to use in the callback - // We're doing this regardless so inputs get tracked, even if we drop the future before polling it let user_fut = cb.call(); let currently_in_first_run = first_run.cloned(); @@ -28,6 +26,10 @@ where #[cfg(feature = "web")] if let Some(o) = crate::html_storage::deserialize::take_server_data::() { + // this is going to subscribe this resource to any reactivity given to use in the callback + // We're doing this regardless so inputs get tracked, even if we drop the future before polling it + kick_future(user_fut); + return o; } } @@ -60,3 +62,17 @@ where _ => Some(resource), } } + +#[inline] +fn kick_future(user_fut: F) +where + F: Future + 'static, +{ + // Kick the future to subscribe its dependencies + use futures_util::future::FutureExt; + let waker = futures_util::task::noop_waker(); + let mut cx = std::task::Context::from_waker(&waker); + futures_util::pin_mut!(user_fut); + + let _ = user_fut.poll_unpin(&mut cx); +}