IMPORTANTE: resource
es experimental. Está listo para que lo pruebes, pero podría cambiar antes de que sea estable.
La mayoría de las APIs de signals son síncronas: signal
, computed
, input
, etc. Sin embargo, las aplicaciones a menudo necesitan manejar datos que están disponibles de forma asíncrona. Un Resource
te da una forma de incorporar datos asíncronos en el código basado en signals de tu aplicación.
Puedes usar un Resource
para realizar cualquier tipo de operación asíncrona, pero el caso de uso más común para Resource
es obtener datos de un servidor. El siguiente ejemplo crea un resource para obtener algunos datos de usuario.
La forma más fácil de crear un Resource
es la función resource
.
import {resource, Signal} from '@angular/core';const userId: Signal<string> = getUserId();const userResource = resource({ // Define un cómputo reactivo. // El valor params se recalcula siempre que cualquier signal leído cambie. params: () => ({id: userId()}), // Define un loader asíncrono que obtiene datos. // El resource llama a esta función cada vez que el valor de `params` cambia. loader: ({params}) => fetchUser(params),});// Crea un signal computed basado en el resultado de la función loader del resource.const firstName = computed(() => { if (userResource.hasValue()) { // `hasValue` sirve 2 propósitos: // - Actúa como type guard para remover `undefined` del tipo // - Protege contra leer un `value` que lanza cuando el resource está en estado de error return userResource.value().firstName; } // fallback en caso de que el valor del resource sea `undefined` o si el resource está en estado de error return undefined;});
La función resource
acepta un objeto ResourceOptions
con dos propiedades principales: params
y loader
.
La propiedad params
define un cómputo reactivo que produce un valor de parámetro. Siempre que las signals leídas en este cómputo cambien, el resource produce un nuevo valor de parámetro, similar a computed
.
La propiedad loader
define un ResourceLoader
— una función asíncrona que obtiene algún estado. El resource llama al loader cada vez que el cómputo params
produce un nuevo valor, pasando ese valor al loader. Consulta la sección Resource loaders a continuación para más detalles.
Resource
tiene un signal value
que contiene los resultados del loader.
Resource loaders
Cuando creas un resource, especificas un ResourceLoader
. Este loader es una función asíncrona que acepta un solo parámetro: un objeto ResourceLoaderParams
: y devuelve un valor.
El objeto ResourceLoaderParams
contiene tres propiedades: params
, previous
, y abortSignal
.
Propiedad | Descripción |
---|---|
params |
El valor del cómputo params del resource. |
previous |
Un objeto con una propiedad status , que contiene el ResourceStatus anterior. |
abortSignal |
Un AbortSignal . Constalta Abortando peticiones para más detalles. |
Si el cómputo params
devuelve undefined
, la función loader no se ejecuta y el estado del resource se convierte en 'idle'
.
Abortando peticiones
Un resource aborta una operación de carga pendiente si el cómputo params
cambia mientras el resource está cargando.
Puedes usar el abortSignal
en ResourceLoaderParams
para responder a peticiones abortados. Por ejemplo, la función nativa fetch
acepta un AbortSignal
:
const userId: Signal<string> = getUserId();const userResource = resource({ params: () => ({id: userId()}), loader: ({params, abortSignal}): Promise<User> => { // fetch cancela cualquier pretición HTTP pendiente cuando el `AbortSignal` dado // indica que la petición ha sido abortada. return fetch(`users/${params.id}`, {signal: abortSignal}); },});
Consulta AbortSignal
en MDN para más detalles sobre cancelación de peticiones con AbortSignal
.
Recargando
Puedes activar programáticamente el loader
de un resource llamando al método reload
.
const userId: Signal<string> = getUserId();const userResource = resource({ params: () => ({id: userId()}), loader: ({params}) => fetchUser(params),});// ...userResource.reload();
Estado del resource
El objeto resource tiene varias propiedades de signal para leer el estado del loader asíncrono.
Propiedad | Descripción |
---|---|
value |
El valor más reciente del resource, o undefined si no se ha recibido ningún valor. |
hasValue |
Si el resource tiene un valor. |
error |
El error más reciente encontrado mientras se ejecutaba el loader del resource, o undefined si no ha ocurrido ningún error. |
isLoading |
Si el loader del resource está ejecutándose actualmente. |
status |
El ResourceStatus específico del resource, como se describe abajo. |
El status
de una signal proporciona un ResourceStatus
específico que describe el estado del resource usando una constante de string.
Estado | value() |
Descripción |
---|---|---|
'idle' |
undefined |
El resource no tiene una peticion válida y el loader no se ha ejecutado. |
'error' |
undefined |
El loader ha encontrado un error. |
'loading' |
undefined |
El loader se está ejecutando como resultado del valor de request cambiando. |
'reloading' |
Valor anterior | El loader se está ejecutando como resultado de llamar al método reload del resource. |
'resolved' |
Valor resuelto | El loader ha completado. |
'local' |
Valor establecido localmente | El valor del resource ha sido establecido localmente vía .set() o .update() |
Puedes usar esta información de estado para mostrar condicionalmente elementos de interfaz de usuario, como indicadores de carga y mensajes de error.
Obtención de datos reactiva con httpResource
httpResource
es un wrapper alrededor de HttpClient
que te da el estado de la petición y la respuesta como signals. Realiza peticiones HTTP a través del stack HTTP de Angular, incluyendo interceptores.