等待redux操作完成调度

Mik*_*gin 19 reactjs redux

我有以下动作创建者:

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

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

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

我怎么能等待appendItem行动结束?在标准反应土地中,我只会使用setState回调:

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

但是dispatch不提供任何回调功能.

Alb*_*les 10

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

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

然后你可以这样称呼它 scrolltoNextItem

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

  • 这如何保证在动作完成后调用`resolve()`? (23认同)
  • 如果我错了,请纠正我,但操作通常是同步的,因此存储已更新,但在反应的情况下,这并不一定意味着所有从 redux 中提取值的组件都已使用这些值重新渲染。 (3认同)
  • 为什么这有 15 票赞成!?它绝对没有什么不同。 (3认同)
  • 由于阿尔瓦罗的评论,这不是一个好的答案。 (2认同)