Передача дополнительной информации об ошибках, обработанных `redux-actions` - PullRequest
0 голосов
/ 09 октября 2018

redux-actions обрабатывает ошибки "автоматически":

, если полезная нагрузка является экземпляром объекта Error, redux-actions автоматически установит action.error в true

И полезная нагрузка будет являться полезной нагрузкой этого действия.

Но если полезная нагрузка сделана из ошибки, как я могу извлечь информацию из этого действия в моем редукторе, чтобы отметить соответствующуюэлемент как «при ошибке» (кроме извлечения информации из сообщения об ошибке)?

import { createAction } from 'redux-actions'
import * as api from '../api'

export const fetchSomethingRequest = createAction('FETCH_SOMETHING_REQUEST')
export const fetchSomethingResponse = createAction('FETCH_SOMETHING_RESPONSE')

export const fetchSomething = id => dispatch => {
  dispatch(fetchSomethingRequest({ id }))

  return api
    .fetchSomething(id)
    .then(something => dispatch(fetchSomethingResponse({ id, something })))
    // I would like to add some information to be able afterwards (eg. in a
    // reducer) to mark `id` as on error
    .catch(error => dispatch(fetchSomethingResponse(error)))
    // with regular actions, I would do something like this
    // .catch(error => dispatch(fetchSomethingResponse({ id, error }))) 
}

Я думаю, я мог бы использовать meta информацию о действии, но я думаю, что здесь что-то упущено.

Примечание: Стандартное действие Flux воспринимает ошибки как концепцию первого класса :

Действия потока могут рассматриваться какасинхронная последовательность значений.Для асинхронных последовательностей важно иметь дело с ошибками.В настоящее время многие реализации Flux не делают этого, а вместо этого определяют отдельные типы действий, такие как LOAD_SUCCESS и LOAD_FAILURE.Это не идеально, потому что перегружает две разные задачи: устранение неоднозначности действий определенного типа из «глобальной» последовательности действий и указание, представляет ли действие ошибку.FSA рассматривает ошибки как концепцию первого класса.

1 Ответ

0 голосов
/ 09 октября 2018

Когда вы передаете ошибку создателю действия, объект ошибки должен быть доступен через action.payload, тогда как action.error - это просто логический флаг, который сигнализирует, что полезная нагрузка является ошибкой.

Вы также можете наследоватьОшибка по умолчанию для хранения дополнительных данных:

class MyError extends Error {
  constructor(message, payload) {
    super(message);
    this.payload = payload
  }
}
...