pub struct Resource<T> { /* private fields */ }Expand description
A reactive resource that automatically fetches data when its dependencies change.
Resource provides a way to reactively fetch data from async operations and automatically
refetch when the input dependencies change. It manages loading states and ensures that only the
most recent result is kept if multiple async operations complete rapidly.
§Concurrency Behavior
If multiple async operations complete while the main thread is busy processing other work, only the most recent result is kept.
§Examples
// Simple case: event loop executor, hash-based memoization, returns Option<T>
let resource = Resource::new(|| user_id.get(), |id| fetch_user(id));
// With initial value
let resource = Resource::with_initial(
|| user_id.get(),
|id| fetch_user(id),
User::default()
);
// Full customization
let resource = Resource::custom(|| user_id.get(), |id| fetch_user(id))
.executor(my_executor)
.key_fn(|id| *id)
.initial(User::default())
.build();Implementations§
Source§impl<T: 'static> Resource<T>
impl<T: 'static> Resource<T>
Sourcepub fn new<Fut, Dep>(
source: impl Fn() -> Dep + 'static,
fetcher: impl Fn(Dep) -> Fut + 'static,
) -> Resource<Option<T>>
pub fn new<Fut, Dep>( source: impl Fn() -> Dep + 'static, fetcher: impl Fn(Dep) -> Fut + 'static, ) -> Resource<Option<T>>
Creates a new reactive resource with sensible defaults.
- Executor: Main event loop (future does not need to be
Send) - Memoization: Hash-based (only refetches when dependency hash changes)
- Initial value: None (returns
Resource<Option<U>>)
§Parameters
source- A function that returns the current dependency value(s).fetcher- An async function that takes the dependency value and returns the fetched data.
§Examples
let user_resource = Resource::new(
|| user_id.get(),
|id| async move { fetch_user(id).await }
);Sourcepub fn with_initial<Fut, Dep>(
source: impl Fn() -> Dep + 'static,
fetcher: impl Fn(Dep) -> Fut + 'static,
initial: T,
) -> Self
pub fn with_initial<Fut, Dep>( source: impl Fn() -> Dep + 'static, fetcher: impl Fn(Dep) -> Fut + 'static, initial: T, ) -> Self
Creates a new reactive resource with an initial value.
Uses the same defaults as new() but allows you to specify an initial value
so the resource is never None.
- Executor: Main event loop (future does not need to be
Send) - Memoization: Hash-based (only refetches when dependency hash changes)
§Parameters
source- A function that returns the current dependency value(s).fetcher- An async function that takes the dependency value and returns the fetched data.initial- The initial value for the resource before any fetch completes.
§Examples
let user_resource = Resource::with_initial(
|| user_id.get(),
|id| async move { fetch_user(id).await },
User::default()
);Sourcepub fn custom<Fut, Dep>(
source: impl Fn() -> Dep + 'static,
fetcher: impl Fn(Dep) -> Fut + 'static,
) -> ResourceBuilder<Fut, Dep, T, DefaultHashKeyFn, EventLoopExecutor, WithMemo, NoInitial>
pub fn custom<Fut, Dep>( source: impl Fn() -> Dep + 'static, fetcher: impl Fn(Dep) -> Fut + 'static, ) -> ResourceBuilder<Fut, Dep, T, DefaultHashKeyFn, EventLoopExecutor, WithMemo, NoInitial>
Creates a resource builder for full customization.
Use this when you need to customize:
- The executor (tokio, custom, etc.)
- The key function (custom comparison logic)
- Memoization behavior (disable with
.no_memo()) - Initial value
§Examples
// Tokio executor with custom key function
let resource = Resource::custom(|| user_id.get(), |id| fetch_user(id))
.tokio_spawn()
.key_fn(|id| *id)
.build();
// Disable memoization
let resource = Resource::custom(|| (), || fetch_latest())
.no_memo()
.build();Sourcepub fn refetch(&self)
pub fn refetch(&self)
Manually triggers a refetch of the resource, bypassing memoization.
This will start a new async fetch operation using the current dependency value, even if that value hasn’t changed since the last fetch.
§Behavior
- Sets the finished state to
false - Spawns a new fetch operation
- Bypasses memoization for this fetch
Sourcepub fn is_loading(&self) -> boolwhere
T: 'static,
pub fn is_loading(&self) -> boolwhere
T: 'static,
Returns true if an async fetch operation is currently in progress.
This can be used to show loading indicators in the UI.
Trait Implementations§
Source§impl<T> SignalRead<T> for Resource<T>
impl<T> SignalRead<T> for Resource<T>
Source§fn id(&self) -> ReactiveId
fn id(&self) -> ReactiveId
Source§fn try_read(&self) -> Option<ReadRef<'_, T>>where
T: 'static,
fn try_read(&self) -> Option<ReadRef<'_, T>>where
T: 'static,
Source§fn try_read_untracked(&self) -> Option<ReadRef<'_, T>>where
T: 'static,
fn try_read_untracked(&self) -> Option<ReadRef<'_, T>>where
T: 'static,
Source§fn read(&self) -> ReadRef<'_, T>where
T: 'static,
fn read(&self) -> ReadRef<'_, T>where
T: 'static,
Source§fn read_untracked(&self) -> ReadRef<'_, T>where
T: 'static,
fn read_untracked(&self) -> ReadRef<'_, T>where
T: 'static,
Source§impl<T: 'static> SignalTrack<T> for Resource<T>
impl<T: 'static> SignalTrack<T> for Resource<T>
Source§impl<T> SignalWith<T> for Resource<T>
impl<T> SignalWith<T> for Resource<T>
Source§fn id(&self) -> ReactiveId
fn id(&self) -> ReactiveId
fn with<O>(&self, f: impl FnOnce(&T) -> O) -> Owhere
T: 'static,
fn with_untracked<O>(&self, f: impl FnOnce(&T) -> O) -> Owhere
T: 'static,
fn try_with<O>(&self, f: impl FnOnce(Option<&T>) -> O) -> Owhere
T: 'static,
fn try_with_untracked<O>(&self, f: impl FnOnce(Option<&T>) -> O) -> Owhere
T: 'static,
impl<T> Copy for Resource<T>
Auto Trait Implementations§
impl<T> Freeze for Resource<T>
impl<T> RefUnwindSafe for Resource<T>where
T: RefUnwindSafe,
impl<T> !Send for Resource<T>
impl<T> !Sync for Resource<T>
impl<T> Unpin for Resource<T>where
T: Unpin,
impl<T> UnwindSafe for Resource<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more