Pensar en los estados antes de la consulta

PokéAtlas consulta datos que no están incluidos en el HTML. Entre pulsar un botón y recibir una respuesta puede haber una espera, un error de conexión o un recurso inexistente.

Una interfaz necesita diferenciar inicio, carga, resultado y error. El mensaje de carga explica la espera; el de error debe permitir entender qué pasó y volver a intentarlo.

Comprobar la respuesta

Consulta mínima a PokéAPI
async function getPokemon(name) {
  const identifier = encodeURIComponent(name.trim().toLowerCase());
  const response = await fetch(
    'https://pokeapi.co/api/v2/pokemon/' + identifier
  );
  if (!response.ok) {
    throw new Error('HTTP ' + response.status);
  }
  return response.json();
}

fetch no rechaza automáticamente la promesa por un HTTP 404. Por eso compruebo response.ok antes de interpretar el JSON.

Actualizar una interfaz sencilla

HTML
<p id="status" role="status"></p>
<p id="result"></p>
JavaScript
const status = document.querySelector('#status');
const result = document.querySelector('#result');

async function showPokemon(name) {
  status.textContent = 'Cargando...';
  result.textContent = '';
  try {
    const pokemon = await getPokemon(name);
    result.textContent = pokemon.name;
    status.textContent = 'Resultado disponible.';
  } catch (error) {
    status.textContent = 'No se pudo consultar. Inténtalo otra vez.';
  }
}

showPokemon('pikachu');

Lo que falta en una interfaz más completa

Si se permiten varias búsquedas seguidas, hay que controlar respuestas antiguas; se puede cancelar la anterior con AbortController. También conviene validar el campo, distinguir errores y manejar imágenes ausentes.

Uso textContent para mostrar el nombre como texto. El ejemplo no cubre todos los casos de producción. El endpoint de Pikachu se verificó al preparar este artículo.