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.

nodejs – el código se ejecutará antes de que await se resuelva

Tengo este fragmento de código que se ejecuta antes de que se resuelva el await.

¿Cómo puedo solucionar esto y ejecutar funciones después de que los resultados esperados se resuelvan?

let trader_positions = await WebRequest(trader_id);

// setto le posizioni as Unchecked
console.log('1) Imposto a 0 tutte le posizioni attive dell utente: ' + nome_trader);
await DataController.setPositionAsUnchecked(nome_trader);

if (trader_positions) {
    console.log('2A) Utente ha delle posizioni aperte..');
    await _.map(trader_positions, async function (data) {
        console.log("POZIONI APERTE");
        console.log(data);
        new Promise((resolve, reject) => async function () {
            let resp = await DataController.checkCoin(data, nome_trader);
            await DataController.verificaCoin(resp, data, nome_trader);
            return resolve(true)
        })
    })
} else {
    console.log('2) utente non ha posizioni aperte');
    return false;
}
console.log('executed before await');

Este es un video que ilustra el flujo de ejecución: https://streamable.com/ji44ej

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para solucionar este problema y ejecutar funciones después de que se resuelvan los resultados esperados, puedes refactorizar el código de la siguiente manera:

    let trader_positions = await WebRequest(trader_id);
    
    // setto le posizioni as Unchecked
    console.log('1) Imposto a 0 tutte le posizioni attivr dell utente: ' + nome_trader)
    await DataController.setPositionAsUnchecked(nome_trader);
    
    if (trader_positions) {
        console.log('2A) Utente ha delle posizioni aperte..')
        await Promise.all(_.map(trader_positions, async function (data) {
            console.log("POZIONI APERTE");
            console.log(data);
            let resp = await DataController.checkCoin(data, nome_trader);
            await DataController.verificaCoin(resp, data, nome_trader);
            return true;
        }));
    } else {
        console.log('2) utente non ha posizioni aperte')
        return false;
    }
    console.log('ejecutado después del await')
    

    Los cambios clave son:
    – Envolver la llamada _.map con Promise.all para esperar que se resuelvan todas las promesas antes de continuar la ejecución.
    – Eliminar la innecesaria llamada new Promise dentro de la función de mapeo.
    – Devolver true en lugar de resolver una promesa dentro de la función de mapeo.
    – Mover la declaración console.log final después del await.

Comments are closed.