Javascript Array.pu sh создание вложенного массива, к которому я не могу получить доступ с помощью индекса - PullRequest
0 голосов
/ 06 мая 2020

Я просмотрел следующие статьи, в которых все go подробно об асинхронных вызовах возвращают значение undefined.

Почему моя переменная не изменяется после того, как я изменяю ее внутри функции? - Ссылка на асинхронный код

Получить данные из fs.readFile

Однако это не отвечает на мой вопрос. В моем примере я использую async, await и .then. Функция asyn c возвращает что-то и заполняет массив, однако это формат массива и способность работать с массивом, с которым я борюсь.

Я использую следующий код для заполнения массива объектами из моей базы данных MongoDB.

const initialClasses = [];

const getInitData = async () => {
  await axios.get('http://localhost:5000/classes/api/')
    .then(response => {
      initialClasses.push(response.data)
    })
    .catch(error => {
      console.log(error)
    });
  }
  getInitData();
  console.log(initialClasses);

Однако, когда я использую console.log initialClasses, я получаю следующий массив:

[]
0: (3) [{…}, {…}, {…}] // objects provided from the async call
length: 1
__proto__: Array(0)

Когда я пытаюсь получить доступ к этому array, используя console.log(initialClasses[0]);, я получаю undefined.

Что я сделал не так при создании этого массива? Есть ли лучший, более чистый способ сделать это, который я упустил? Спасибо.

1 Ответ

1 голос
/ 06 мая 2020

Сначала я бы порекомендовал вернуться к Почему моя переменная не изменяется после того, как я изменяю ее внутри функции? - Ссылка на асинхронный код по мере роста вашего понимания асинхронного поведения. Я считаю, что это root проблемы здесь (поэтому некоторые члены сообщества ощущают это как дубликат).

Почему вы получаете undefined при вызове console.log(initialClasses[0]), будет зависеть от того, когда вы называете это, и мы снова ожидаем undefined, если вы назовете это слишком рано и неправильно поймете, как работает async.

Но вместо того, чтобы углубляться в эти сорняки, давайте перейдем к root вашего вопроса: есть способ чище? Да! Вероятно, недопонимание здесь связано с тем, как вы это структурировали. Вы можете значительно упростить его и получить ту же функциональность.

Вы можете вызвать следующую функцию внутри asyn c функцию

const response = await axios.get('http://localhost:5000/classes/api/');
let initialClasses = response.data;

Это будет предпочтительным способом, поскольку кто бы вы ни были желание работать с ответом от этой конечной точки по сути асинхронно. Таким образом, данные ответа также не будут «вложенными».

...