#javascript #node.js #asynchronous #async-await #axios
Вопрос:
Я пытаюсь вызвать API масштабирования для различных идентификаторов собраний. Но я не могу понять поведение асинхронного ожидания.
У меня есть две функции:
- getDesiredRecordings: Фильтрует массив записей для требуемых записей. При этом, если запись действительна, я вызываю другую функцию, которая возвращает мне повестку дня идентификаторов собраний.
- getMeetingAgenda: Предназначена для возврата идентификатора текущей встречи.
Эта повестка дня хранится в соответствии с идентификатором в объекте. Но повестка дня выходит неопределенной. Я попробовал console.log(response.data.agenda);
использовать вторую функцию, и она объединяет повестку дня, но почему вся повестка дня собрания выходит неопределенной, я не могу ее отменить. Я думаю, что цикл for не ждет await getMeetingAgenda
, и я не могу понять, как заставить цикл for ждать. Я также попробовал троичный оператор, который тоже не работает.
код:
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] amp;amp; recordings[i].topic amp;amp; 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 "";
});
}
Комментарии:
1. 1. Старайтесь не смешивать
async
/await
с обратными вызовами. В этом нет необходимости. 2.getMeetingAgenda
ничего неreturn
делает. Он просто запускает асинхронные запросы, и как только он будет завершен, он завершится. Вам нужноreturn
доawait axios.get()
, но также см. 1. — лучше, если вы просто напишете это без.then()
s
Ответ №1:
Возврат axios.начните работать в функции getMeetingAgenda. return axios.get...
Ответ №2:
Вам нужно дождаться завершения всех обещаний в recordings
цикле. Удалите цикл for и используйте функцию map:
await Promise.all(recordings.map(async (recording) => {
if (recording amp;amp; recording.topic amp;amp; 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);
Также сделайте так, чтобы ваша getMeetingAgenda
функция возвращала axios: return axios..
Комментарии:
1. Это тоже работает, нет необходимости возвращаться
recording
, так как я нажимаю нужные значения в массиве и картах. Если я удалюreturn axios.get...
это тоже не получится.