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);
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 agetEvents
, 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 structEvents
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:
Esto registrará la longitud del arreglo
Events.date
después de que se hayan agregado los eventos.Alternativamente, puedes usar un enfoque
async/await
:Esto esperará a que se resuelva la promesa
getEvents
antes de continuar con el buclefor
y registrar el structEvents
.