Merge pull request #443 from flisky/master
fixes to usability and some edge case cleanup
This commit is contained in:
3 files changed
+15
-26
No files matched your search
@@ -609,7 +609,7 @@ impl ScopeState {
|
|||||||
|
|
||||||
/// Create a subscription that schedules a future render for the reference component
|
/// Create a subscription that schedules a future render for the reference component
|
||||||
///
|
///
|
||||||
/// ## Notice: you should prefer using prepare_update and get_scope_id
|
/// ## Notice: you should prefer using schedule_update_any and scope_id
|
||||||
pub fn schedule_update(&self) -> Arc<dyn Fn() + Send + Sync + 'static> {
|
pub fn schedule_update(&self) -> Arc<dyn Fn() + Send + Sync + 'static> {
|
||||||
let (chan, id) = (self.tasks.sender.clone(), self.scope_id());
|
let (chan, id) = (self.tasks.sender.clone(), self.scope_id());
|
||||||
Arc::new(move || {
|
Arc::new(move || {
|
||||||
@@ -1000,12 +1000,11 @@ impl TaskQueue {
|
|||||||
fn remove(&self, id: TaskId) {
|
fn remove(&self, id: TaskId) {
|
||||||
if let Ok(mut tasks) = self.tasks.try_borrow_mut() {
|
if let Ok(mut tasks) = self.tasks.try_borrow_mut() {
|
||||||
let _ = tasks.remove(&id);
|
let _ = tasks.remove(&id);
|
||||||
|
if let Some(task_map) = self.task_map.borrow_mut().get_mut(&id.scope) {
|
||||||
|
task_map.remove(&id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// the task map is still around, but it'll be removed when the scope is unmounted
|
// the task map is still around, but it'll be removed when the scope is unmounted
|
||||||
if let Some(task_map) = self.task_map.borrow_mut().get_mut(&id.scope) {
|
|
||||||
task_map.remove(&id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn has_tasks(&self) -> bool {
|
pub(crate) fn has_tasks(&self) -> bool {
|
||||||
|
|||||||
@@ -337,29 +337,12 @@ impl VirtualDom {
|
|||||||
|
|
||||||
let scopes = &mut self.scopes;
|
let scopes = &mut self.scopes;
|
||||||
let task_poll = poll_fn(|cx| {
|
let task_poll = poll_fn(|cx| {
|
||||||
//
|
|
||||||
let mut any_pending = false;
|
|
||||||
|
|
||||||
let mut tasks = scopes.tasks.tasks.borrow_mut();
|
let mut tasks = scopes.tasks.tasks.borrow_mut();
|
||||||
let mut to_remove = vec![];
|
tasks.retain(|_, task| task.as_mut().poll(cx).is_pending());
|
||||||
|
|
||||||
// this would be better served by retain
|
match tasks.is_empty() {
|
||||||
for (id, task) in tasks.iter_mut() {
|
true => Poll::Ready(()),
|
||||||
if task.as_mut().poll(cx).is_ready() {
|
false => Poll::Pending,
|
||||||
to_remove.push(*id);
|
|
||||||
} else {
|
|
||||||
any_pending = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for id in to_remove {
|
|
||||||
tasks.remove(&id);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resolve the future if any singular task is ready
|
|
||||||
match any_pending {
|
|
||||||
true => Poll::Pending,
|
|
||||||
false => Poll::Ready(()),
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -74,6 +74,13 @@ impl AtomRoot {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log::trace!("no atoms found for {:?}", ptr);
|
log::trace!("no atoms found for {:?}", ptr);
|
||||||
|
atoms.insert(
|
||||||
|
ptr,
|
||||||
|
Slot {
|
||||||
|
value: Rc::new(value),
|
||||||
|
subscribers: HashSet::new(),
|
||||||
|
},
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user