如何使用redux确保承诺的正确承诺顺序?

时间:2018-06-04 19:45:30

标签: javascript redux promise redux-thunk

我正在使用redux(和反应),我必须做多次api请求一定次数。我正在使用for循环并承诺所有。订单承诺正在解决是因为订单是随机的 - 首先是第二个承诺得到解决,然后是第一个,然后是第三个而不是1,2,3个。 我做错了什么或者我怎么能改变订单?另外,当我没有收到任何数据时,停止迭代的方法是什么?我将不得不迭代约25次,但不想硬编码。我可以用我的渔获量来确定吗?非常感谢!

动作:

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)    
    }
}

1 个答案:

答案 0 :(得分:1)

如果在解决3个请求时调度的操作顺序很重要,您可以尝试两件事:

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

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语句一样。