Tengo una función asíncrona que solicita un objeto con una propiedad de nombre e identificación. Entiendo que no puede volver a await axios.get(url).data.name sin que lo pateen en la instrucción catch.
Sin embargo, mi pregunta es ¿cuál es la razón por la que no funciona?
async function getConstellationNameById(id) { const url = `${BASE_URL}/constellations/${id}`; try { return await axios.get(url).data.name; } catch (error) { throw `Constellation with id of ${id} could not be found.`; } }Si almaceno la solicitud GET en una variable y luego uso la notación de puntos para acceder a la propiedad del nombre, funciona:
try { //return axios.get(url).data.name; const constellation = await axios.get(url); return constellation.data.name; } ¿Es porque la notación de puntos tiene un tiempo? Por lo tanto, mientras la solicitud GET está en la cola de eventos, la parte .data.name se considera código de sincronización y no obtiene nada. Pensé que, dado que se está ejecutando todo en una línea, los accesores de propiedad se ejecutarían junto con la solicitud GET.
¿O es por otra razón?
También pensé que solo podía acceder a las propiedades de un objeto Promise dentro de .then() y .catch() ; ¿No es ese el caso?
¡Disculpe de antemano si estoy usando mal alguna terminología ya que todavía estoy aprendiendo! Realmente quiero asegurarme de que entiendo el razonamiento antes de continuar.
. tiene mayor prioridad que await , por lo que su código es equivalente a:
return await (axios.get(url).data.name); entonces axios.get(url).data.name tendría que ser una Promesa. Pero la promesa que desea esperar es devuelta por axios.get(url) . Agregue paréntesis para forzar la agrupación adecuada:
return (await axios.get(url)).data.name;