1.0.2-beta.5 • Published 4 years ago

with-async v1.0.2-beta.5

Weekly downloads
1
License
MIT
Repository
-
Last release
4 years ago

with-async

Avoid boilerplate and a common pitfalls when working with asynchronous data in react.

A soon to be obsolete way of dealing with asynchronous data in react components. Provides a hook, higher-order component and render prop so you can pick your favorite flavor.

Installation

yarn add with-async

Or if using npm

npm install --save with-async

Usage

Check out the demo and the code that drives it folder.

import React from 'react';
import { useAsync, isLoading, hasFailed, hasSucceeded } from 'with-async';
import { fetchJsonPlaceholderPost } from './remote-api';

export const AsyncComponent = (props) => {
  const async = useAsync(() => fetchJsonPlaceholderPost(props.postId), [props.postId])
  return (
    <div className="DisplayPost">
      {isLoading(async) && <ProgressIndicator />}
      {hasFailed(async) && <ErrorMessage />}
      {hasSucceeded(async) &&
        (async.result.post == null ? (
          <div>No post found with id {props.postId}</div>
        ) : (
          <>
            <LabelledValue label="Title">{async.result.post.title}</LabelledValue>
            <LabelledValue label="Body">
              <p>{async.result.post.body}</p>
            </LabelledValue>
          </>
        ))}
      <button onClick={() => async.call(true)}>Fetch again with loading state</button>
      <button onClick={() => async.call()}>Fetch again in background</button>
    </div>
  )
}

Polling for changes

import React from 'react';
import { useAsync, hasSucceeded } from 'with-async';
import { fetchJsonPlaceholderPost } from './remote-api';

export const PollingComponent = (props) => {
  const async = useAsync(
    () => fetchJsonPlaceholderPost(props.postId), 
    [props.postId], 
    { pollInterval: 1000 }
  )
  return (
    <div className="DisplayPost">
      {hasSucceeded(async) &&
        (async.result.post == null ? (
          <>
            <LabelledValue label="Title">{async.result.post.title}</LabelledValue>
            <LabelledValue label="Body">
              <p>{async.result.post.body}</p>
            </LabelledValue>
          </>
        )}
    </div>
  )
}

Imperative api

import React from 'react';
import { useAsync, hasFailed } from 'with-async';
import { fetchJsonPlaceholderPost } from './remote-api';

export const RetryComponent = (props) => {
  const async = useAsync(() => fetchJsonPlaceholderPost(props.postId), [props.postId])
  return (
    <div className="DisplayPost">
      {hasFailed(async) && (    
        <>
          <button onClick={() => async.call(true)}>Retry with a loading state</button>
          <button onClick={() => async.call()}>Retry silently</button>
        </>
      )}
    </div>
  )
}
1.0.2-beta.4

4 years ago

1.0.2-beta.5

4 years ago

1.0.2-beta.2

4 years ago

1.0.2-beta.3

4 years ago

1.0.0-beta.0

5 years ago

0.8.0

5 years ago

0.7.0

6 years ago

0.6.0

6 years ago

0.5.0

6 years ago

0.4.0

6 years ago

0.3.0

6 years ago

0.2.0

6 years ago

0.1.0

6 years ago

0.0.0

6 years ago