Estoy tratando de llamar a una API de zoom para varias identificaciones de reuniones. Pero no puedo descifrar el comportamiento de async-await.
tengo dos funciones:
Esta agenda se almacena correspondiente a la id en un objeto. Pero, La agenda está resultando ser indefinida. console.log(response.data.agenda); dentro de la segunda función y consuela la agenda, pero no puedo entender por qué toda la agenda de la reunión está indefinida. Creo que el bucle for no await getMeetingAgenda y no puedo averiguar cómo hacer que el bucle for espere. También probé el operador ternario que también falla.
CÓDIGO:
let { meetingIds, requiredMeetings, meetingAgendas } = await getDesiredRecordings(recordings,config); async function getDesiredRecordings(recordings, config) { try { let requiredMeetings = []; if (!recordings || !Object.keys(recordings).length) { return requiredMeetings; } let meetingIds = []; let meetingAgendas = {}; let isMeetingValid = false; console.log(config) for (let i = 0; i < recordings.length; i++) { if (recordings[i] && recordings[i].topic && isRecordingValid(recordings[i].topic)) { requiredMeetings.push(recordings[i]); meetingIds.push(recordings[i].id); // meetingAgendas[recordings[i].id] = await getMeetingAgenda(recordings[i].id,config); isMeetingValid = true; } isMeetingValid ? meetingAgendas[recordings[i].id] = await getMeetingAgenda(recordings[i].id,config): "" ; console.log("getDesiredRecordings ID: ",recordings[i].id, meetingAgendas[recordings[i].id]); //Prints after getMeetingAgends console(correct id,undefined) isMeetingValid = false; } console.log(meetingAgendas); //All undefined return { "meetingIds": meetingIds, "requiredMeetings": requiredMeetings, "meetingAgendas" : meetingAgendas }; } catch (e) { return Promise.reject(new Error(e)); } } async function getMeetingAgenda(meetingId, config) { console.log(meetingId) await axios.get(`${Zoom_Agenda_End_Point}${meetingId}`, config) .then(function (response) { console.log(response.data.agenda); return response.data.agenda; }) .catch(e=>{ console.log("Axios error occured in getMeetingAgenda: ",e); return ""; }); }Devolver axios.get funcionó en la función getMeetingAgenda. return axios.get...
Debe esperar a que todas las promesas terminen en el ciclo de recordings . Elimine el bucle for y use la función de mapa:
await Promise.all(recordings.map(async (recording) => { if (recording && recording.topic && isRecordingValid(recording.topic)) { requiredMeetings.push(recording); meetingIds.push(recording.id); // meetingAgendas[recording.id] = await getMeetingAgenda(recording.id,config); isMeetingValid = true; } isMeetingValid ? meetingAgendas[recording.id] = await getMeetingAgenda(recording.id,config): "" ; console.log("getDesiredRecordings ID: ",recording.id, meetingAgendas[recording.id]); //Prints after getMeetingAgends console(correct id,undefined) isMeetingValid = false; return recording; })); console.log(meetingAgendas); También haga que su función getMeetingAgenda devuelva un axios: return axios..