【问题标题】:Passing additional information to errors handled by `redux-actions`将附加信息传递给由 `redux-actions` 处理的错误
【发布时间】:2018-10-09 18:03:16
【问题描述】:

redux-actions “自动”处理错误:

如果有效负载是一个错误对象的实例,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 Standard Action 将错误视为first class concept

Flux 动作可以被认为是一个异步的值序列。这是 对于异步序列处理错误很重要。目前,许多通量 实现不这样做,而是定义单独的动作类型,如 LOAD_SUCCESS 和 LOAD_FAILURE。这不太理想,因为它超载 两个不同的关注点:消除某种类型的动作与 “全局”动作序列,并指示一个动作是否代表一个 错误。 FSA 将错误视为一流的概念。

【问题讨论】:

    标签: javascript redux redux-actions


    【解决方案1】:

    当您将错误传递给动作创建者时,错误对象应该可以通过action.payload 访问,而action.error 只是一个布尔标志,表示有效负载是错误的。

    你也可以继承默认的Error来存储额外的数据:

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

    【讨论】:

    • 是的,这就是我对the error will be the payload of this action 的意思。我不知道如何从这个有效载荷中提取信息,或者从一般的动作中提取信息(例如,id 这个错误与哪个有关)。
    • @Jean-BaptisteRudant 哦,我明白了,为此,您必须明确定义您的操作负载,就像您在代码中的注释中提到的那样:fetchSomethingResponse({ id, error })
    • 谢谢@eugene-tsakh。但是通过这样做,我忽略了作为“一流概念”的错误概念,并且当redux-actions 的默认行为传递错误时,我看不到很多用例(大多数情况下,我需要了解有关错误的更多信息)。
    • @Jean-BaptisteRudant 你也可以使用你的自定义错误。在我的答案中添加了更多信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2015-03-30
    相关资源
    最近更新 更多