diff --git a/packages/yew/src/scheduler.rs b/packages/yew/src/scheduler.rs index 1824d7493cc..956e4e1000a 100644 --- a/packages/yew/src/scheduler.rs +++ b/packages/yew/src/scheduler.rs @@ -46,6 +46,9 @@ fn with(f: impl FnOnce(&mut Scheduler)) { #[inline] pub(crate) fn push(runnable: Box) { with(|s| s.main.push_back(runnable)); + // Execute pending immediately. Necessary for runnables added outside the component lifecycle, + // which would otherwise be delayed. + start(); } /// Push a component creation Runnable to be executed @@ -113,3 +116,27 @@ impl Scheduler { .or_else(|| self.main.pop_front()) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn push_executes_runnables_immediately() { + use std::cell::Cell; + + thread_local! { + static FLAG: Cell = Default::default(); + } + + struct Test; + impl Runnable for Test { + fn run(self: Box) { + FLAG.with(|v| v.set(true)); + } + } + + push(Box::new(Test)); + FLAG.with(|v| assert!(v.get())); + } +}