Blog>
Snippets

Error Handling in Streaming with createAsyncThunk

Implement error handling within a createAsyncThunk stream consumer, demonstrating the use of conditional dispatches based on error types.
import { createAsyncThunk } from '@reduxjs/toolkit';

// Define the async thunk for streaming data with error handling
export const streamDataWithThunk = createAsyncThunk(
  'data/streamWithThunk',
  async (arg, { dispatch, rejectWithValue, getState }) => {
    try {
      const response = await startDataStream(arg);
      // Handle the streaming logic here
      // For example, consuming data from the response...
      response.on('data', (chunk) => {
        // Process each chunk of data
        dispatch(dataReceived(chunk));
      });
    } catch (error) {
      // Check the type of error and dispatch it accordingly
      if (error.response) {
        // The request was made and the server responded with a status code
        // that falls out of the range of 2xx
        const message = error.response.data.message;
        return rejectWithValue(message);
      } else if (error.request) {
        // The request was made but no response was received
        dispatch(networkError());
        return rejectWithValue('Network error, no response received.');
      } else {
        // Something happened in setting up the request that triggered an Error
        dispatch(genericError());
        return rejectWithValue('An unexpected error occurred.');
      }
    }
  }
);
This code defines an asynchronous thunk action for streaming data using the 'createAsyncThunk' method from Redux Toolkit. It sets up the streaming logic and dispatches actions based on the consumed chunks of data. The thunk also includes error handling, which checks if the error is due to the response, the request, or an unexpected issue, dispatches appropriate actions, and uses 'rejectWithValue' to return a rejected action with an error message.
// Additional actions that may be dispatched in response to different error scenarios
const dataReceived = (chunk) => ({
  type: 'data/received',
  payload: chunk
});

const networkError = () => ({
  type: 'error/networkError',
  payload: null
});

const genericError = () => ({
  type: 'error/genericError',
  payload: null
});
This code defines additional Redux actions that can be dispatched during error handling. 'dataReceived' is dispatched when a chunk of data is received successfully. 'networkError' and 'genericError' are dispatched in case of a network error or an unexpected error, respectively, during the data streaming attempt.