Ver Fonte

Merge pull request #2033 from DioxusLabs/jk/kick-sf-on-client

Kick server futures on the client to track reactivity
Jonathan Kelley há 1 ano atrás
pai
commit
2d2e9dc56a
1 ficheiros alterados com 18 adições e 2 exclusões
  1. 18 2
      packages/fullstack/src/hooks/server_future.rs

+ 18 - 2
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::<T>() {
+                    // 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<F, T>(user_fut: F)
+where
+    F: Future<Output = T> + '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);
+}