Как обеспечить правильный порядок обещаний в обещаниях, используя редукс? - PullRequest
0 голосов
/ 04 июня 2018

Я использую 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 голосов
/ 05 июня 2018

Вы можете попробовать 2 вещи, если важен порядок действий, отправляемых при разрешении 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}) добавьте, какой запрос завершен, чтобы редуктор знал, где обновить состояние.Что-то вроде dispatch({type: FETCH_DATA_SUCESS, payload: {request_from:start,data:res.data}}) и то же самое для оператора catch.

...