How to optimally combine multiple axios responses

风格不统一 提交于 2021-01-29 02:58:42

问题


I am working with a React app. I have to create 2 objects using responses from 3 different APIs. For example:

  1. DataObject1 will be created using API1 and API2
  2. DataObject2 will be created using API1, API2, and API3

So, I am thinking about what would be the most optimal way of doing this by making sure 1 call each API only once.

I was thinking this:

const requestOne = axios.get(API1);
const requestTwo = axios.get(API2);
const requestThree = axios.get(API3);

axios.all([requestOne, requestTwo, requestThree]).then(axios.spread((...responses) => {
  const dataObject1 = createDataObject1(responses[0], responses[1]);
  const dataObject2 = createDataObject2(responses[0], responses[1], responses[2]);
  // use/access the results 
})).catch(errors => {
  // react on errors.
})

const createDataObject1 = (response1, response2) => { //Combine required data and return dataObject1 }
const createDataObject2 = (response1, response2, response3) => { //Combine required data and return dataObject2 }

Is there a better way of doing this?


回答1:


Looks fine.

You can change this

axios.all([requestOne, requestTwo, requestThree]).then(axios.spread((...responses) => {
  const dataObject1 = createDataObject1(responses[0], responses[1]);
  const dataObject 2 = createDataObject2(responses[0], responses[1], responses[2]);
  // use/access the results 
})).catch(errors => {
  // react on errors.
})

to

axios.all([requestOne, requestTwo, requestThree]).then(axios(response) => {
  const dataObject1 = createDataObject1(responses[0], responses[1]);
  const dataObject 2 = createDataObject2(responses[0], responses[1], responses[2]);
  // use/access the results 
}).catch(errors => {
  // react on errors.
})

because spreading and resting is redundant.

If you don't want to use them like responses[0], responses[1], etc then you can use:

axios.all([requestOne, requestTwo, requestThree]).then(axios.spread((response1, response2, response3) => {
  const dataObject1 = createDataObject1(response1, response2);
  const dataObject 2 = createDataObject2(response1, response2,response3);
  // use/access the results 
})).catch(errors => {
  // react on errors.
})



回答2:


Are you using thunk middleware to make async calls in Redux? I don't want to assume that you are, but that seems like a good basic approach here.

const requestOne = axios.get(API1);
const requestTwo = axios.get(API2);
const requestThree = axios.get(API3);

Okay. So now requestOne.data has the result of making the axios get request. Or, would if the thunk creator was async and the code was const requestOne = await axios.get(API1);

Do you need to parse the data further from request___.data ?

If not you can just have

const dataObj1 = { response1: requestOne.data, response2: requestTwo.data }
const dataObj2 = { ... dataObject1, response3: requestThree.data };

Full answer:

// store/yourFile.js code
export const YourThunkCreator = () => async dispatch => {
  try {
    const const requestOne = await axios.get(API1);
    // other axios requests
    const dataObj1 = { response1: requestOne.data, response2: requestTwo.data }
    const dataObj2 = { ... dataObject1, response3: requestThree.data };
    // other code
    dispatch(// to Redux Store);
  } catch (error) {
    console.error(error);
  }



来源:https://stackoverflow.com/questions/61038630/how-to-optimally-combine-multiple-axios-responses

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!