价值到达晚了?“下面的价值刚刚被评估”。

4
let currComp = this;
let projects = []
let dataArr = []    


async function getData() {
  let getProject =
    await axios.get('url', {
      auth: {
        username: 'username',
        password: 'pw'
      }
    })

  let projects = await getProject.data.value;
  let arr = []
  let KPIs = []

  projects.map(project => {
    let item = () => axios.get(`url`, {
      auth: {
        username: 'username',
        password: 'pw'
      }
    })

    arr.push(item)
    console.log('arr', arr)
  })

  let results = await axios.all(arr)

  results.map(result => {

    result().then(function(v) {
      KPIs.push(v.data.value)
    })
  })

}

getData();

我要做的是:
  1. 使用axios调用获取项目名称。
  2. 使用这些获取到的名称调用多个axios调用,以便从该项目中获取一些数据。
  3. results = await axios.all(arr) 包含提供API调用响应的函数。
  4. 响应结果被推入数组KPIs中。
  5. 当我试图在最后用 console.log('KPIs', KPIs) 时,它会输出一个似乎为空的数组:

enter image description here

但是当我打开它时,

enter image description here

它实际上包含了我想要的值。

问题是,当我尝试在代码中使用这个数组时,它只给出了数组的第一个元素。

我尝试在网上搜索这个问题,但只告诉我这个值到达太晚了。

我想使用完整的数组和完整的结果。

我该如何解决?


你为什么要创建那个函数数组? - Bergi
1个回答

1

results = await axios.all(arr) 包含了能够给我API调用的响应的函数。

是的,但这没有意义。你不需要返回响应的promise函数,并且在函数数组上调用 axios.all 或等待它也没有用。

相反,你需要构建一个promise数组,并使用 all()await 来处理它们。

你也不需要使用 then。你可以大大简化你的代码:

async function getData() {
  const getProject = await axios.get('url', {
    auth: {
      username: 'username',
      password: 'pw'
    }
  });

  const projects = getProject.data.value;
  const promises = projects.map(project =>
    axios.get(`url`, {
      auth: {
        username: 'username',
        password: 'pw'
      }
    })
  );

  const results = await axios.all(promises)

  const KPIs = results.map(v => v.data.value);
}

看起来它正在工作!有一件事是,当我进行第二个axios调用时,由于该项目中不存在数据,因此某些API将无法工作。这是有意的。但是我希望在不存在数据时跳过它,并仅从存在数据的那个项目中调用它。我该怎么做? - Dawn17
1
你可以在调用之前过滤 projectsresults - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接