Невозможно получить доступ к JavaScript объектам в массиве - PullRequest
0 голосов
/ 17 марта 2020

В настоящее время у меня есть список имен с назначениями, инициализированный вне функции, и мой код помещает объекты в этот массив из этой функции.

var appointments = [];
async function getAllAppointmentEvents() {
    var doctorList = await getAllDoctors();
    // For all doctors
    for (let i = 1; i < doctorList["doctorinfo"].length; i++) {
        // Find their appointments
        schedule = await getAppointmentsByDoctor(i).then(function (response) { return response; });
        // For each appointment
        if (schedule["schedules"] !== undefined) {
            for (let j = 0; j < schedule["schedules"].length; j++) {
                var startDate = new Date(schedule["schedules"][j]["datetime"]);
                // startDate = new Intl.DateTimeFormat("")
                var endDate = new Date(schedule["schedules"][j]["datetime"]);
                endDate.setHours(startDate.getHours() + 1);
                var result = {
                    title: doctorList["doctorinfo"][i][1],
                    start: startDate.toISOString().slice(0, 19),
                    end: endDate.toISOString().slice(0, 19),
                    color: "#C0C0C0",
                    groupId: doctorList["doctorinfo"][i][0]
                };
                appointments.push(result);
            }
        }
    }
}

Когда я получаю консольный вывод журнала, я получаю пустой массив, который, кажется, содержит все все объекты. Но я не могу получить доступ к объектам по appointments[0]. Я также попытался распечатать Object.keys(appointments), и у него тоже нет ключей. Когда я console.log внутри функции, массив доступен как обычно.

Вывод, который я получаю, когда я console.log список извне функции: output

Мне нужна помощь для доступа к объектам извне функции. Спасибо!

1 Ответ

0 голосов
/ 17 марта 2020

Ваш первый для l oop - это синхронная операция. При каждой операции она будет проходить через операции внутри блока l oop и переходить к следующей итерации (i ++ и повторять все).

Внутри синхронного l oop вы выполняете асинхронную операцию:

schedule = await getAppointmentsByDoctor(i).then(function (response) { return response; }); 

syn c l oop плохо работает с вашей асинхронной операцией c - вероятно, почему ваш массив не заполняется к тому времени, как вы ожидаете.

Вы можете использовать реализацию Promise.all с текущим async / await для решения вашей проблемы.

Вы также можете найти реализацию asyncForEach, как в этой статье и в этой сущности .

Суть контента в случае его удаления:

const waitFor = (ms) => new Promise(r => setTimeout(r, ms))
const asyncForEach = async (array, callback) => {
  for (let index = 0; index < array.length; index++) {
    await callback(array[index], index, array)
  }
}

const start = async () => {
  await asyncForEach([1, 2, 3], async (num) => {
    await waitFor(50)
    console.log(num)
  })
  console.log('Done')
}

start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...