Каково правильное поведение асинхронного ожидания внутри цикла for с вызовом axios?

#javascript #node.js #asynchronous #async-await #axios

Вопрос:

Я пытаюсь вызвать API масштабирования для различных идентификаторов собраний. Но я не могу понять поведение асинхронного ожидания.

У меня есть две функции:

  1. getDesiredRecordings: Фильтрует массив записей для требуемых записей. При этом, если запись действительна, я вызываю другую функцию, которая возвращает мне повестку дня идентификаторов собраний.
  2. 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... это тоже не получится.