Merge pull request #1926 from ealmloff/fix-client-side-suspense

Fix client side suspense
This commit is contained in:
Jonathan Kelley authored and GitHub committed 2024-02-12 18:52:03 -08:00
commit 49f3b8235d
2 files changed
+13 -12

No files matched your search

+1 -1
View File
@@ -439,7 +439,7 @@ impl VirtualDom {
self.process_events(); self.process_events();
// Now that we have collected all queued work, we should check if we have any dirty scopes. If there are not, then we can poll any queued futures // Now that we have collected all queued work, we should check if we have any dirty scopes. If there are not, then we can poll any queued futures
if !self.dirty_scopes.is_empty() || !self.suspended_scopes.is_empty() { if !self.dirty_scopes.is_empty() {
return; return;
} }
+12 -11
View File
@@ -61,10 +61,7 @@ pub use crate::cfg::Config;
#[cfg(feature = "file_engine")] #[cfg(feature = "file_engine")]
pub use crate::file_engine::WebFileEngineExt; pub use crate::file_engine::WebFileEngineExt;
use dioxus_core::VirtualDom; use dioxus_core::VirtualDom;
use futures_util::{ use futures_util::{pin_mut, select, FutureExt, StreamExt};
future::{select, Either},
pin_mut, FutureExt, StreamExt,
};
mod cfg; mod cfg;
mod dom; mod dom;
@@ -159,17 +156,21 @@ pub async fn run(virtual_dom: VirtualDom, web_config: Config) {
let (mut res, template) = { let (mut res, template) = {
let work = dom.wait_for_work().fuse(); let work = dom.wait_for_work().fuse();
pin_mut!(work); pin_mut!(work);
let mut rx_next = rx.select_next_some();
#[cfg(all(feature = "hot_reload", debug_assertions))] #[cfg(all(feature = "hot_reload", debug_assertions))]
match select(work, select(hotreload_rx.next(), rx.next())).await { {
Either::Left((_, _)) => (None, None), let mut hot_reload_next = hotreload_rx.select_next_some();
Either::Right((Either::Left((new_template, _)), _)) => (None, new_template), select! {
Either::Right((Either::Right((evt, _)), _)) => (evt, None), _ = work => (None, None),
new_template = hot_reload_next => (None, Some(new_template)),
evt = rx_next => (Some(evt), None),
}
} }
#[cfg(not(all(feature = "hot_reload", debug_assertions)))] #[cfg(not(all(feature = "hot_reload", debug_assertions)))]
match select(work, rx.next()).await { select! {
Either::Left((_, _)) => (None, None), _ = work => (None, None),
Either::Right((evt, _)) => (evt, None), evt = rx_next => (Some(evt), None),
} }
}; };