Merge pull request #772 from Demonthos/fix-future-on-dropped-scope

This commit is contained in:
Jon Kelley 2023-01-15 12:56:12 -08:00 committed by GitHub
commit 7f4e45de49
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 1 deletions

View File

@ -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) {

View File

@ -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<Output = ()> + '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
}