Skip to content

Make your async components compact and descriptive by leveraging the power of the language features

License

Notifications You must be signed in to change notification settings

alexeyraspopov/react-coroutine

Repository files navigation

React Coroutine

npm install react-coroutine

Coroutines are computer program components that generalize subroutines for nonpreemptive multitasking, by allowing multiple entry points for suspending and resuming execution at certain locations. Coroutines are well-suited for implementing more familiar program components such as cooperative tasks, exceptions, event loop, iterators, infinite lists and pipes.
Wikipedia

Describe complex async state flows in your React components using only language features like generators, async functions, and async generators.

No API or new abstractions to learn, only JavaScript code as it intended to be.

Motivation

React Coroutine attempts to use basic and known language features for the sake of solving problems that are usually solved with APIs and new abstractions that require particular knowledge about them or, sometimes, about internal processes.

Examples

import React from 'react';
import Coroutine from 'react-coroutine';
async function UserListContainer() {
  try {
    // Wait for async data and render it in the same way as plain components
    let users = await Users.retrieve();
    return <UserList users={users} />;
  } catch (error) {
    // Handle failures in place with just JavaScript tools
    return <ErrorMessage error={error} />;
  }
}

export default Coroutine.create(UserListContainer);
async function* PokemonInfoPage({ pokemonId, pokemonName }) {
  // Use generators to provide multiple render points of your async component
  yield <p>Loading {pokemonName} info...</p>;

  // Easily import components asynchronously and render them on demand
  let { default: PokemonInfo } = await import('./PokemonInfo.react');
  let data = await PokemonAPI.retrieve(pokemonId);

  return <PokemonInfo data={data} />;
}

export default Coroutine.create(PokemonInfoPage);
function* MovieInfoLoader({ movieId }) {
  // Assuming cache.read() return a value from cache or Promise
  let movieData = yield movieCache.read(movieId);
  return <MovieInfo data={movieData} />;
}

export default Coroutine.create(MovieInfoLoader);

Documentation

See details page for more.

Installation

React Coroutine project is available as the react-coroutine package on NPM. Installed package includes precompiled code (ECMAScript 5), ES Modules-friendly artifact, LICENSE, and the changelog.

Contributing

Current project has adopted a Code of Conduct which is expected to be adhered by project participants. Please also visit the document website to learn more.

Please read the contributing guide to learn how to propose bug fixes and improvements, and how to build and test your changes.