【问题标题】:Wait for a redux action to finish dispatching等待一个 redux 动作完成调度
【发布时间】:2017-04-18 04:20:42
【问题描述】:

我有以下动作创建者:

export function scrolltoNextItem(item) {
  return (dispatch, getState) => {
    dispatch(appendItem(Item));
    dispatch(
      scrollToNextIndex(
        getState().items.length - 1
      )
    )
  }
}

问题是 scrollToNextItem 在 appendItem 完成之前运行并且滚动位置最终不正确。我可以通过添加setTimeout 来证明是这种情况,以使脚本的执行在运行scrollToNextItem 之前等待下一个滴答声:

export function scrolltoNextItem(item) {
  return (dispatch, getState) => {
    dispatch(appendItem(Item));
    setTimeout(() => {
      dispatch(
        scrollToNextIndex(
          getState().items.length - 1
        )
      )
    }, 0);
  }
}

如何等待appendItem 操作完成?在标准反应领域,我只会使用setState 回调:

this.setState({something: 'some thing'}, () => {
  console.log('something is set');
});

dispatch 不提供任何回调功能。

【问题讨论】:

  • appendItem 看起来如何?
  • 追加项目只是一个简单的动作。
  • 那么它应该是同步的,当你到达 setTimeout 时,appendItem 已经完成@mikeRifgin
  • 看看 Hooks Api 中的“useEffect”,它可能对你正在寻找的东西有用。

标签: reactjs redux


【解决方案1】:

您始终可以将 appendItem 包装到一个 Promise 中并将 dispatch 作为参数传递给它

const appendItem = (item, dispatch) => new Promise((resolve, reject) => {
  // do anything here
  dispatch(<your-action>);
  resolve();
}

那你可以从scrolltoNextItem这样称呼它

export function scrolltoNextItem(item) {
  return (dispatch, getState) => {
    appendItem(Item, dispatch).then(() => {
      dispatch(
        scrollToNextIndex(
          getState().items.length - 1
        )
      )
    })
  }
}

【讨论】:

  • 当然,我怎么没想到呢!谢谢 :) 我假设您打算从上面的示例中删除 setTimeout?
  • 这如何保证在操作完成后调用resolve()
  • 是的。操作通常是同步的,除非您使用 thunk 或其他异步操作 redux.js.org/docs/advanced/AsyncActions.html
  • 如果我错了,请纠正我,但动作通常是同步的,所以商店已经更新,但在反应的情况下,这并不一定意味着所有正在从中提取值的组件redux 已使用这些值重新渲染。
  • 由于 Alvaro 的评论,这不是一个好的答案。
猜你喜欢
  • 2021-10-10
  • 2021-03-05
  • 2020-04-23
  • 2019-04-25
  • 2019-11-06
  • 1970-01-01
  • 2019-02-14
  • 2018-09-28
  • 1970-01-01
相关资源
最近更新 更多