Axios进入.then内部,则无法正常工作

时间:2019-04-27 15:30:16

标签: reactjs axios

我正在使用axios发出http请求。在.then()内部,我正在使用另一个axios调用。最后,我有第三个then()应该在第二个then之后运行,但实际上并没有这样做。

let assets = [];

export const initAssets = () => {
    return dispatch => {
        dispatch(setLoadingToTrue());
        axios.get('https://....json')
            .then(response => {
                for(let key in response.data) {
                    assets.push(response.data[key]);
                }
            })
            .then(() => {
                const token = '...';
                assets.forEach((cur) => {
                    axios.get('...' + cur.ticker + '/quote?token=' + token)
                    .then(response => {
                        console.log(response);
                        cur.price = response.data.latestPrice;
                    })                    
                })                
            })
            .then(() => {
                dispatch(initAllAssets(assets));
                dispatch(setLoadingToFalse());
            })
            .catch(error => {
                console.log(error);
                dispatch(setLoadingToFalse());
            })
    }
}

最后一个.then上的分派在第二个中的axios请求之前执行,然后完成。我怎样才能使最后一个然后仅在第二个axios请求完成后才能运行?

1 个答案:

答案 0 :(得分:4)

您可以使用Promise.all将响应返回到下一个.then块,并且在第二个.then

中所有承诺都得到解决后,将调用该响应
let assets = [];

export const initAssets = () => {
    return dispatch => {
        dispatch(setLoadingToTrue());
        axios.get('https://....json')
            .then(response => {
                for(let key in response.data) {
                    assets.push(response.data[key]);
                }
            })
            .then(() => {
                const token = '...';
                const promises = [];
                assets.forEach((cur) => {
                    promises.push(axios.get('...' + cur.ticker + '/quote?token=' + token)
                    .then(response => {
                        console.log(response);
                        cur.price = response.data.latestPrice;
                    }))                   
                }) 
                return Promise.all(promises);               
            })
            .then(() => {
                dispatch(initAllAssets(assets));
                dispatch(setLoadingToFalse());
            })
            .catch(error => {
                console.log(error);
                dispatch(setLoadingToFalse());
            })
    }
}