React Promise Suspense Hook

0.3.4 · abandoned · verified Sun Apr 19

react-promise-suspense provides a single React hook, `usePromise`, designed to integrate any Promise-based asynchronous operation with React Suspense. It allows components to 'suspend' rendering while awaiting data, leveraging React's built-in loading states via `React.Suspense` boundaries. The library reached its current stable version, 0.3.4, in March 2020, and has not received updates since, indicating it is no longer actively maintained. While it functions similarly to libraries like `fetch-suspense`, `react-promise-suspense` is generic and works with any JavaScript Promise, not just `fetch`. Due to its last update being over six years ago, compatibility with newer React versions (beyond React 16/17) and modern Suspense features like `use` hook or SuspenseList might be limited or require careful testing.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates fetching data for multiple Pokemon concurrently using `usePromise` within `Suspense` boundaries, showcasing loading states.

import React, { Suspense } from 'react';
import usePromise from 'react-promise-suspense';

const fetchData = async (id) => {
  const response = await fetch(`https://pokeapi.co/api/v2/pokemon/${id}/`);
  if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
  return response.json();
};

const PokemonDisplay = ({ pokemonId }) => {
  const data = usePromise(fetchData, [pokemonId]);
  return (
    <div className="pokemon-card">
      <h2>{data.name}</h2>
      <img src={data.sprites.front_default} alt={data.name} />
      <p>Height: {data.height}</p>
      <p>Weight: {data.weight}</p>
    </div>
  );
};

const App = () => {
  return (
    <div className="app-container">
      <h1>Pokemon Viewer</h1>
      <Suspense fallback={<div>Loading Pokemon...</div>}>
        <PokemonDisplay pokemonId={1} />
        <PokemonDisplay pokemonId={4} />
        <PokemonDisplay pokemonId={7} />
      </Suspense>
      <style>{`
        .app-container { font-family: sans-serif; text-align: center; }
        .pokemon-card { border: 1px solid #eee; margin: 10px; padding: 15px; border-radius: 8px; display: inline-block; width: 200px; vertical-align: top; }
        img { width: 100px; height: 100px; }
      `}</style>
    </div>
  );
};

export default App;

view raw JSON →