Javascript Array.push 创建一个我无法使用索引访问的嵌套数组

Javascript Array.push creating a nested array which I cannot access using the index

我看过以下文章,它们都深入探讨了异步调用 return undefined。

Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference

Get data from fs.readFile

然而,这并没有回答我的问题。在我的示例中,我使用 asyncawait.then。异步函数是 returning 一些东西,并填充数组,但它是数组的格式,以及处理我正在努力处理的数组的能力。

我正在使用以下代码用我的 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)

当我尝试访问此数组时,使用 console.log(initialClasses[0]); 我得到未定义。

我在创建这个数组时做错了什么?有没有更好,更清洁的方法来做到这一点我忽略了?谢谢。

首先,我想我建议重新访问 Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference 随着您对异步行为的理解的增长。我相信这是问题的根源(因此这对社区的某些成员来说感觉像是重复)。

为什么当你调用 console.log(initialClasses[0]) 时得到 undefined 将取决于你调用它的时间,如果你过早调用它并且误解了 async 的工作原理,我们会再次期望 undefined .

但是,与其深入探讨那些杂草,不如直击问题的根源:是否有更清洁的方法?是的!可能这里的误解来自于你构建它的方式。您可以大大简化它并获得相同的功能。

您可以在异步函数中调用以下内容

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

这将是首选方式,因为无论您想对来自该端点的响应做什么,基本上都是异步的。这样响应数据也不会是'nested'。