diff --git a/packages/core/src/arena.rs b/packages/core/src/arena.rs index 13ded6f5d..39beaa490 100644 --- a/packages/core/src/arena.rs +++ b/packages/core/src/arena.rs @@ -116,6 +116,11 @@ impl VirtualDom { for hook in scope.hook_list.get_mut().drain(..) { drop(unsafe { BumpBox::from_raw(hook) }); } + + // Drop all the futures once the hooks are dropped + for task_id in scope.spawned_tasks.borrow_mut().drain() { + scope.tasks.remove(task_id); + } } fn drop_scope_inner(&mut self, node: &VNode) { diff --git a/packages/core/src/scopes.rs b/packages/core/src/scopes.rs index 2f18d14bd..5be209c4c 100644 --- a/packages/core/src/scopes.rs +++ b/packages/core/src/scopes.rs @@ -319,7 +319,9 @@ impl<'src> ScopeState { /// Pushes the future onto the poll queue to be polled after the component renders. pub fn push_future(&self, fut: impl Future + 'static) -> TaskId { - self.tasks.spawn(self.id, fut) + let id = self.tasks.spawn(self.id, fut); + self.spawned_tasks.borrow_mut().insert(id); + id } /// Spawns the future but does not return the [`TaskId`] @@ -340,6 +342,8 @@ impl<'src> ScopeState { .unbounded_send(SchedulerMsg::TaskNotified(id)) .expect("Scheduler should exist"); + self.spawned_tasks.borrow_mut().insert(id); + id }