import { component$, useStore, Resource, useResource$, $, useStyles$, } from '@builder.io/qwik'; import styles from './../index.css?inline'; export const DataFetchingRestBreakingBad = component$(() => { useStyles$(styles); const store = useStore({ // personaje seleccionado idCharacter: '1', // Botones para seleccionar ids de personajes (50 y -1 no existen) idsButton: ['1', '2', '3', '4', '50', '-1'], }); const API_URL = 'http://localhost:3000'; // http://localhost:3000/character/ const getSelectCharacter = $( async (id: string, controller?: AbortController): Promise> => { const data = await fetch(`${API_URL}/character/${id}`, { method: 'GET', signal: controller?.signal, }); const json = await data.json(); return json ? json : [Promise.reject(json)]; } ); const selectCharacterResource = useResource$(({ track, cleanup }) => { // Usamos `track` para realizar nuevas consultas cuando cambia el personaje seleccionado track(() => store.idCharacter); // La función `cleanup` se ejecuta cuando se está re-ejecutando y // el controlador `AbortController` puede abortar la operación anterior porque se ha interrumpido. const abortController = new AbortController(); cleanup(() => abortController.abort()); // Se obtiene la información del personaje seleccionado. return getSelectCharacter(store.idCharacter, abortController); }); return (
{store.idsButton.map((id) => ( ))}
Loading...
} onRejected={(error) => (
Error: {error.message}
)} onResolved={(result) => { return ( <>

Instrucciones a seguir

Haciendo click en uno de los botones se va a cargar la información del personaje seleccionado. En la{' '} API {' '} tenemos información de 21 personajes, del 1 al 21 (incluidos) por lo que las opciones -1 y 50 no tendrá información de un personaje

{result.hasOwnProperty('name') ? ( <>

{result.name}

  • Descripción: {result.description}
  • Nº Episodios: {result.episodes}
  • Más información:{' '} {result.url}
) : (

{result.message}

)}
); }} />
); });