es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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
Tags:  ,

Answer

  1. Avatar for 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:

    async function main() {
        getParametersData()
        await poll()
        await my_plot()
    } 
    
    async function getData() {
        const response = await fetch(API)
        const message = await response.json()
        return message
    }
    
    async function poll(count = 1) {
        console.log(`Haciendo encuesta ${count}`);
        try {
            const data = await getData();
            if (data && Object.keys(data).length !== 0) {
                console.log("Encuesta", data)
                return;
            } else {
                await new Promise(resolve => setTimeout(resolve, 5000));
                return poll(++count);
            }
        } catch (err) {
            console.log(`${err}. Haciendo encuesta nuevamente en 5 segundos.`);
            await new Promise(resolve => setTimeout(resolve, 5000));
            return poll(1);
        }
    
    }
    
    async function my_plot() {
        console.log("mi gráfico")
    }
    

    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:

    Haciendo encuesta 1
    Haciendo encuesta 2
    Haciendo encuesta 3
    Encuesta [1,2,3]
    mi gráfico
    

Comments are closed.