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.

Problema de Javascript al guardar variables en una función con una promesa

Estoy tratando de recuperar una lista de eventos de un calendario de Google y eso funciona, pero no puedo averiguar cómo guardarlos en una estructura. La estructura está vacía en el último registro, pero muestra “2” directamente después de empujar los valores.
Sé que es un problema de alcance, pero no puedo encontrar una solución.

Realmente apreciaría si alguien tiene un consejo o una solución para mí. Gracias de antemano.

// Obtener todos los eventos entre dos fechas
const getEvents = async (dateTimeStart, dateTimeEnd) => {

try {
    let response = await calendar.events.list({
        auth: auth,
        calendarId: calendarId,
        timeMin: dateTimeStart,
        timeMax: dateTimeEnd,
        timeZone: 'Europe/Berlín'
    });

    let items = response['data']['items'];
    return items;
} catch (error) {
    console.log(`Error en getEvents -> ${error}`);
    return 0;
}

};

let start = ‘2021-12-01T00:00:00.000Z’;
let end = ‘2022-01-01T00:00:00.000Z’;

var Events = {
date: new Array(),
title: new Array()
};

var test = getEvents(start, end)
.then((res) => {
for(let i = 0; i < res.length; i++)
{
let DateGFormat = ”;

        // Filtrar eventos de todo el día y eventos programados
        if(res[i].start.dateTime)
        {
            DateGFormat = res[i].start.dateTime.split('T')[0];
        }
        else 
        {
            DateGFormat = res[i].start.date;
        }

        let Year = DateGFormat.split('-')[0];
        let Month = DateGFormat.split('-')[1];
        let Day = DateGFormat.split('-')[2];

        const dayString = `${Day}/${Month}/${Year}`;
        const Title = res[i].summary;

        Events.date.push(dayString);
        Events.title.push(Title);
        console.log(Events.date.length);
    }
})
.catch((err) => {
    console.log(err);
});

console.log(Events.date.length);

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que la función getEvents es asíncrona y devuelve una promesa. Por lo tanto, cuando llamas a getEvents, no devuelve inmediatamente el resultado sino una promesa. El resultado solo está disponible cuando se resuelve la promesa.

    En este caso, la variable test es una promesa y el struct Events se registra fuera de la función de resolución de la promesa, por lo que se registra antes de que se resuelva la promesa. Por eso está vacío.

    Una solución es mover el registro dentro de la función de resolución, de esta manera:

    var test = getEvents(start, end)
        .then((res) => {
            for(let i = 0; i < res.length; i++)
            {
                // ...
            }
            console.log(Events.date.length);
        })
        .catch((err) => {
            console.log(err);
        });
    

    Esto registrará la longitud del arreglo Events.date después de que se hayan agregado los eventos.

    Alternativamente, puedes usar un enfoque async/await:

    async function main() {
      var test = await getEvents(start, end);
      for(var i = 0; i < test.length; i++) {
          // ...
      }
      console.log(Events.date.length);
    }
    
    main().catch((err) => {
      console.log(err);
    });
    

    Esto esperará a que se resuelva la promesa getEvents antes de continuar con el bucle for y registrar el struct Events.

Comments are closed.