Skip to content

Commit 1debbbe

Browse files
authored
fix: Avoid data race in query subscription by making query creation synchronous in use_query (#48)
1 parent 0bb9b66 commit 1debbbe

File tree

1 file changed

+16
-11
lines changed

1 file changed

+16
-11
lines changed

src/query.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@ use std::{
1111
};
1212

1313
use dioxus::prelude::*;
14-
use dioxus::{
15-
hooks::{use_memo, use_reactive},
16-
signals::CopyValue,
17-
};
14+
use dioxus::signals::CopyValue;
1815
use dioxus_core::{
1916
provide_root_context, spawn_forever, use_drop, ReactiveContext, SuspendedFuture, Task,
2017
};
@@ -548,7 +545,7 @@ impl<Q: QueryCapability> QueryReader<Q> {
548545
}
549546

550547
pub struct UseQuery<Q: QueryCapability> {
551-
query: Memo<Query<Q>>,
548+
query: Signal<Query<Q>>,
552549
}
553550

554551
impl<Q: QueryCapability> Clone for UseQuery<Q> {
@@ -718,7 +715,7 @@ pub fn use_query<Q: QueryCapability>(query: Query<Q>) -> UseQuery<Q> {
718715

719716
let current_query = use_hook(|| Rc::new(RefCell::new(None)));
720717

721-
let query = use_memo(use_reactive!(|query| {
718+
let mut make_query = |query: &Query<Q>| {
722719
let query_data = storage.insert_or_get_query(query.clone());
723720

724721
// Update the query tasks if there has been a change in the query
@@ -730,22 +727,30 @@ pub fn use_query<Q: QueryCapability>(query: Query<Q>) -> UseQuery<Q> {
730727
current_query.borrow_mut().replace(query.clone());
731728

732729
// Immediately run the query if enabled and the value is stale
733-
if query.enabled && query_data.state.borrow().is_stale(&query) {
730+
if query.enabled && query_data.state.borrow().is_stale(query) {
734731
let query = query.clone();
735732
spawn(async move {
736733
QueriesStorage::run_queries(&[(&query, &query_data)]).await;
737734
});
738735
}
736+
};
739737

740-
query
741-
}));
738+
let mut curr_query = use_hook(|| {
739+
make_query(&query);
740+
Signal::new(query.clone())
741+
});
742+
743+
if *curr_query.read() != query {
744+
curr_query.set(query);
745+
make_query(&*curr_query.read());
746+
}
742747

743748
// Update the query tasks when the scope is dropped
744749
use_drop({
745750
move || {
746-
storage.update_tasks(query.peek().clone());
751+
storage.update_tasks(curr_query.peek().clone());
747752
}
748753
});
749754

750-
UseQuery { query }
755+
UseQuery { query: curr_query }
751756
}

0 commit comments

Comments
 (0)