异步等待不等待功能完成

时间:2019-01-22 20:51:27

标签: javascript asynchronous foreach async-await fetch-api

我使用访存来获取数组中每个元素的数据。这些值被压入一个数组中,一旦获取所有值,我想返回这些值的最大值。

为此,我使用了一个承诺:

 async function init() {
     await maxWaste(nut0Codes).then(response => {
         console.log(response);
     });
 }

 function maxWaste(nutCodes) {
     return new Promise(resolve => {
         let waste = [];
         nutCodes.forEach((element) => {
             let query = queryMaxWaste(element);
             fetch(address + encodeURIComponent(query))
                 .then(response => {
                      return response.json();
                  })
                 .then(response => {
                        waste.push(response.results.bindings[0].wasteGeneration.value);
                        console.log(waste);
                 });
         });
         let maxWaste = Math.max(waste);
         resolve(maxWaste);
     });
 }

我不确定我的错误在哪里,但是解决是在完成提取之前发生的:

enter image description here

我从console.log(response)收到零,但我不知道为什么它不起作用。

任何建议将不胜感激!

1 个答案:

答案 0 :(得分:2)

如果要编写使用async的代码,则应实际使用async。如果需要同步运行,可以在for循环中等待。如果希望它们同时运行,请使用mapPromise.all

async function init() {
  const response = await maxWaste(nut0Codes);
  console.log(response);
}

async function maxWaste(nutCode) {
  const waste = [];

  for (const element in nutCode) {
    const query = queryMaxWaste(element);
    const response = await fetch(address + encodeURIComponent(query));
    const json = await response.json();
    waste.push(json.results.bindings[0].wasteGeneration.value);
    console.log(waste);
  }
  const maxWaste = Math.max(waste);
  return maxWaste;
}

您还可以尝试这样编写代码,以免在运行下一个fetch之前不必等待每个响应完成:

async function init() {
  const response = await maxWaste(nut0Codes);
  console.log(response);
}

async function maxWaste(nutCode) {
  const waste = await Promise.all(nutCode.map(async element => {
    const query = queryMaxWaste(element);
    const response = await fetch(address + encodeURIComponent(query));
    const json = await response.json();
    return json.results.bindings[0].wasteGeneration.value;
  }));

  return Math.max(waste);
}