【问题标题】:Await value returned from a redux-thunk dispatch rather than using state等待从 redux-thunk 调度返回的值,而不是使用状态
【发布时间】:2019-12-04 03:35:07
【问题描述】:

我正在使用 react、redux 和 redux-thunk 有一组我必须在“逻辑层”中运行的查询。每个“action”调用的结果决定了我采取的路径,所以我实际上在等待从 dispatch 调用返回给 redux-thunk 的 promise。

const handleClick = async (args) => {
  let foo = await dispatch(fetchFoo(args));
  if(foo) { do something... }
  else {
    let bar = await dispatch(fetchBar(args));
    if(bar) { do another thing... }
    else { or do another thing... }
   }
};

thunk 示例:

export const fetchFoo = args => async (dispatch) => {
  let foo = await api.fetchFoo(args);
  dispatch(fetchSuccess(foo));
  // !!!!!!!!!!
  return foo;
  // !!!!!!!!!!
}

如果我不这样做,等到重新渲染(可能)将“foo”放入 redux 状态道具,然后再等到重新渲染(可能)将“bar”放入,这是非常尴尬的redux 状态等...

我以前从未真正见过这种模式,尽管我已经看到等待 void 承诺从 thunk 返回。

是否可以从 redux-thunk 操作返回值并使用它而不是从 redux 状态选择器中获取值?这似乎打破了“单一事实来源”的规则。如果没有,我该怎么办?

【问题讨论】:

    标签: reactjs redux react-redux redux-thunk


    【解决方案1】:

    使用这种方法,重构状态和更改数据加载方式会变得更加困难。假设要求发生变化,fetchBar() 应该按间隔调用,或者需要由父级加载并通过道具传递。或者你想限制加载。或者缓存数据一段时间。

    我使用了这个模式并返回了Promise,发现它让事情变得相当复杂。我发现的唯一优势:我不需要在 redux 存储中使用 isLoadingloadingError 标志来知道数据是否已经加载。

    但这也意味着我必须重复调用一些方法来检索全新的 Promise 等待 - 因为承诺只能解决一次 - 以便等待一些数据加载。一旦某个动作依次触发了少量 API 调用,我就以等待我什至不需要的数据结束。

    相反,如果我们只依赖redux 中的数据,那将像const isStillLoading = props.isData1Loading && props.isData2Loading 一样简单

    考虑将数据加载到动作本身的移动条件。如果您发现 API 调用序列变得过于复杂,您可以切换到 redux-sagaredux-loop,它们都可以更好地控制执行流程。

    【讨论】:

    • 我必须再读几遍才能确保我理解。对于一点背景,我正在浏览数千条记录,然后单击一个加载需要 foo 或 bar 的详细信息窗口的记录。我可以在详细信息窗口中加载,但我喜欢它现在的简单程度。
    • 在这种特殊情况下,使用redux 存储特定于上下文的数据可能没有任何好处,您怎么看?
    • 是的,我有这样的想法,我只是想将 api 排除在我的组件之外。
    猜你喜欢
    • 2018-05-30
    • 2023-03-23
    • 2022-01-06
    • 1970-01-01
    • 2018-05-21
    • 2021-06-26
    • 2019-12-29
    • 2018-11-16
    • 1970-01-01
    相关资源
    最近更新 更多