From d50e86492eb58fb51ca04627c2d2064d7a72f170 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Thu, 24 Mar 2022 11:15:07 -0400 Subject: [PATCH] fix: instantly resolving futures should not use popping --- examples/order.rs | 28 ++++++++++++++++++++++++++++ packages/desktop/src/controller.rs | 7 ++++--- 2 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 examples/order.rs diff --git a/examples/order.rs b/examples/order.rs new file mode 100644 index 000000000..fee6f9184 --- /dev/null +++ b/examples/order.rs @@ -0,0 +1,28 @@ +#![allow(non_snake_case)] + +//! This example proves that instantly resolving futures don't cause issues + +use dioxus::prelude::*; + +fn main() { + dioxus::desktop::launch(App); +} + +fn App(cx: Scope) -> Element { + cx.render(rsx!(Demo {})) +} + +fn Demo(cx: Scope) -> Element { + let fut1 = use_future(&cx, (), |_| async move { + std::thread::sleep(std::time::Duration::from_millis(100)); + 10 + }); + + cx.render(match fut1.value() { + Some(value) => { + let content = format!("content : {:?}", value); + rsx!(div{ "{content}" }) + } + None => rsx!(div{"computing!"}), + }) +} diff --git a/packages/desktop/src/controller.rs b/packages/desktop/src/controller.rs index 8a1494e52..2fa1355d2 100644 --- a/packages/desktop/src/controller.rs +++ b/packages/desktop/src/controller.rs @@ -61,9 +61,10 @@ impl DesktopController { loop { dom.wait_for_work().await; - let mut muts = dom.work_with_deadline(|| false); - while let Some(edit) = muts.pop() { + let muts = dom.work_with_deadline(|| false); + + for edit in muts { edit_queue .lock() .unwrap() @@ -97,7 +98,7 @@ impl DesktopController { let mut queue = self.pending_edits.lock().unwrap(); let (_id, view) = self.webviews.iter_mut().next().unwrap(); - while let Some(edit) = queue.pop() { + for edit in queue.drain(..) { view.evaluate_script(&format!("window.interpreter.handleEdits({})", edit)) .unwrap(); }