首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何确保所有使用redux的promise中承诺的正确顺序?

如何确保所有使用redux的promise中承诺的正确顺序?
EN

Stack Overflow用户
提问于 2018-06-05 03:45:30
回答 1查看 2.9K关注 0票数 1

我正在使用redux (和react),并且我必须进行一定次数的多次api请求。我使用了for循环和promise all。订单承诺正在被解决是问题所在,因为订单是随机的-首先是第二个承诺得到解决,然后是第一个,然后是第三个,而不是1,2,3。我做错了什么吗,或者我如何改变顺序?另外,当我没有收到任何数据时,该如何停止迭代呢?我将不得不迭代大约25次,但不想硬编码。我能用我的捕获物来确定吗?非常感谢!

操作:

代码语言:javascript
复制
export const fetchData = () => {
    return dispatch => {
        const promises = [];

        dispatch({type: FETCHING_DATA})

        for (var i = 0; i < 3; i++) {
            const start = i === 0 ? 0 : (i + "01");
            let getData = axios.get(`${api_root_url}/v1/?start=${start}`)    
                .then(res => {
                    dispatch({type: FETCH_DATA_SUCESS, payload: res.data})
                })
                .catch(err => {
                    dispatch({type: FETCH_DATA_ERR, payload: err.data})
                })
            promises.push(getData)
        }
        return Promise.all(promises)    
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-05 05:28:54

如果在解析这3个请求时调度的操作顺序很重要,您可以尝试两种方法:

只需在所有3个操作完成后调度操作:

代码语言:javascript
复制
export const fetchData = () => {
    return dispatch => {
        const promises = [];

        dispatch({type: FETCHING_DATA});
        Promise.all(
          [...new Array(3)].map((ignore,i)=>i === 0 ? 0 : (i + "01"))
          .map(
            start=>axios.get(`${api_root_url}/v1/?start=${start}`)
          )  
        ).then(
          results=>results.forEach(
            result=>
              dispatch({type: FETCH_DATA_SUCESS, payload: result.data})
            )
        ).catch(
          err => dispatch({type: FETCH_DATA_ERR, payload: err.data})
        );
        //not sure why you want to return something here
        //return Promise.all(promises)    
    }
}

或者保持代码的原样,但是在dispatch({type: FETCH_DATA_SUCESS, payload: result.data})中添加已经完成的请求,这样reducer就知道在哪里更新状态。类似于dispatch({type: FETCH_DATA_SUCESS, payload: {request_from:start,data:res.data}}),与catch语句相同。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50687759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档