¿Cuál es la forma correcta de manipular el valor de retorno de una solicitud async realizada con " axios " y devolver otra Promise ?
Éste:
return axios.get('/home.json') .then(({ data, ...res }) => new Promise({ data: data.json(), ...res }) )o
return new Promise(() => { const { data, ...res } = await axios.get('/home.json') return { data: data.json(), ...res } })...¿O ninguno de los anteriores?
Dado que axios.get() ya devuelve una promesa, puede simplemente construir sobre la cadena de promesa y devolver su valor final desde el final de la cadena y se convertirá en el valor resuelto de toda la cadena de promesa que volverá a la persona que llama:
return axios.get('/home.json').then(data) => // build whatever return value you want here and just return it // it will be the resolved value of the parent promise/chain // If you want to pack it into an object, you can do so here return {data: data}; });Si necesita alguna otra operación asíncrona para desempaquetar los datos y generar su resultado final, simplemente agregue esa operación asíncrona a la cadena de promesa anterior (devolviendo una promesa desde dentro de la cadena).
PD: no entiendo por qué está pensando que .then(({ data, ...res }) es el formato adecuado para un resultado de promesa de axios. Lo mejor que puedo decir de la documentación, no lo es. Resuelve con un valor, el resultado de la solicitud. Además, no hay .json() con axios. Ya analiza los resultados de JSON por usted (a diferencia de fetch() ).
Si quisiera que esto funcionara con fetch() donde tiene que leer y analizar el json por separado, podría hacer esto:
return fetch('/home.json').then(response) => return response.json(); }).then(result => { // create whatever final result value you want and return it return {data: result}; });_
Siento que la mejor manera de hacerlo es usar async-await dentro de un bloque try-catch . Código de muestra:
const getApi = async() => { try{ const {data, ...res} = await axios.get('/home.json') // this data is already in json usable format }catch(e){ console.log('This error occurred',e) } }