Necesito realizar una serie de llamadas HTTP a la API externa como parte de la inicialización de mi back-end de Node.js (recopilar datos de la API externa e inicializar los datos locales). Idealmente algo como esto
function callOne() {...} function callTwo(input) {...} function callThree(input) {...} result1 = callOne(); result2 = callTwo(result1); result3 = callThree(result2);con cada paso separado del otro.
La solución sencilla con .then() anidado garantiza la secuencia de canalización, pero no me parece muy agradable (mala legibilidad, difícil de depurar, gestión complicada de errores con .catch() en cada paso...). Traté de seguir el patrón async/await, algo como esto:
... function async callOne() { const promise = await axios.get(url1); return promise.data; } function async callTwo(params) { const promise = await axios.get(url2,params); return promise.data; } function async callThree(data) { const promise = await axios.get(url3,params); return promise.data; } result1 = callOne(); result2 = callTwo(result1); result3 = callThree(result2); console.log(result3); ...pero de alguna manera no funcionó (. Los datos se especifican en una Promesa pendiente, lo que conduce a la "propiedad del objeto indefinido"). ¿Qué tiene de malo el ejemplo anterior? ¿Cuál es el propósito de esperar si aún devuelve una Promesa pendiente? ¿Cómo podría hacer que la función realmente devuelva el valor final?
--Tomás
Cada función async siempre devuelve una Promise . Como no usa await o .then() al llamar a las tres funciones, no se esperan entre sí. Deberías hacerlo así:
async function callApi(){ const result1 = await axios.get(url1) const result2 = await axios.get(url2, result1.data) const result3 = await axios.get(url3, result2.data) }Lo mismo también se aplicaría si desea mantener las funciones.
result1 = await callOne(); result2 = await callTwo(result1); result3 = await callThree(result2); Solo tenga en cuenta: para usar la palabra clave await , debe estar dentro de una función marcada como async .