¿Por qué se ejecuta la función aunque se use await?
He utilizado la palabra clave await
en la función principal para esperar a que se complete la llamada asincrónica a la función poll()
y, sin embargo, la llamada a la función my_plot()
se realiza antes de que se complete la función poll()
.
async function main() {
getParametersData()
await poll()
my_plot()
}
async function getData() {
const response = await fetch(API)
const message = await response.json()
return message
}
async function poll(count = 1) {
console.log(`Polling ${count}`);
try {
const data = await getData();
if (data && Object.keys(data).length !== 0) {
console.log("Poll", data)
return;
} else {
setTimeout(poll, 5000, ++count);
}
}
catch (err) {
console.log(`${err}. Polling again in 5 seconds.`);
setTimeout(poll, 5000, 1);
}
}
async function my_plot() {
console.log("mi plot")
}
Salida del código:
Polling 1
mi plot
Polling 2
Polling 3
Poll [1,2,3]
Esperado:
Polling 1
Polling 2
Polling 3
Poll [1,2,3]
mi plot
davy.ai
El problema aquí está con la función setTimeout utilizada dentro de la función poll. La función setTimeout se utiliza para retrasar la ejecución de la función poll después de un cierto período de tiempo. Sin embargo, este retraso puede hacer que la función my_plot se ejecute antes de que la función poll haya completado su tarea.
Para solucionar este problema, podemos modificar la función poll para que devuelva una promesa que se resuelva cuando se complete la votación. Luego podemos esperar esta promesa en la función principal antes de llamar a la función my_plot. Aquí está el código actualizado:
Ahora, la función poll devolverá una promesa que se resuelve solo cuando se complete la encuesta. La función my_plot también está envuelta en una declaración await para asegurar que se ejecute solo después de que se complete la encuesta. Con estos cambios, la salida esperada debería ser: