加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在Redux中处理两个连续的和依赖的Async调用?

发布时间:2020-12-14 00:48:27 所属栏目:百科 来源:网络整理
导读:我通过从componentDidMount上的组件调用fetchPosts来异步获取帖子列表.我希望,一旦该请求被相关的reducer(更新状态)接收和处理,就可以使用刚接收到的帖子ids的数组来调用另一个动作fetchPostsMetaData. 我正在使用redux-thunk中间件,并使用jQuery.ajax做出我
我通过从componentDidMount上的组件调用fetchPosts来异步获取帖子列表.我希望,一旦该请求被相关的reducer(更新状态)接收和处理,就可以使用刚接收到的帖子ids的数组来调用另一个动作fetchPostsMetaData.

我正在使用redux-thunk中间件,并使用jQuery.ajax做出我的ajax请求

什么是最好的方法呢?我尝试了谷歌搜索,但找不到相关的例子/答案.

使用redux-thunk:
class PostIndex extends React.Component {
  componentDidMount() {
    const { dispatch } = this.props;
    dispatch(getPosts());
  }
  ...
}

function fetchPosts() {
  return dispatch => {
    fetchPostsAjax()
      .then(res => {
        dispatch({ type: 'RECEIVE_POSTS',payload: res });
        dispatch(fetchPostMeta(res));
      })
  }
}

function fetchPostMeta(posts) {
  return dispatch => {
    fetchPostMetaAjax(posts)
      .then(res => dispatch({ type: 'RECEIVE_POST_META',payload: res }));
    }
  }
}

function fetchPostAjax() {
   // return a promise,whether from jQuery.ajax or fetch
}

function fetchPostMetaAjax() {
  // return a promise
}

这是一个非常标准的用于redux-thunk的用例.上面的例子是针对你提出问题的方式提供的,但是您可以在一个单一的动作创建者中完成此操作:查看这里提供的redux-thunk示例:http://redux.js.org/docs/advanced/AsyncActions.html

不同的是,在我的例子中,我在一个thunk内部分派了一个thunk,而不是直接在第一个thunk里面做第二个任务.所以相当于这个:

function fetchPosts() {
  return dispatch => {
    fetchPostsAsync()
      .then(res => { // res is posts
        dispatch({ type: 'RECEIVE_POSTS',payload: res });
        return fetchPostMetaAsync(res);
      })
      .then(res => { // res  is metadata
        dispatch({ type: 'RECEIVE_POST_META',payload: res });
      })
  }
}

您不会遇到任何竞争条件,因为当您分派{类型:RECEIVE_POSTS,payload:res}时,它是同步的,并且reducer在发送以下异步操作之前更新.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读