简体   繁体   中英

Async await does not wait for function to finish

I use fetch to get data for each element of an array. Those values are pushed into an array and I want to return the max of those values once all values are fetched.

For that I used a promise:

 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);
     });
 }

I am not sure where my mistake is but the resolve happens before the fetch is done :

在此处输入图片说明

I receive the zero from the console.log(response) and I don't know why it is not working.

Any advice would be appreciated!

If you're going to write code that uses async , you should actually leverage async . If this needs to be run synchronously-ish, you can await within a for loop. If you want them all to run simultaneously, use a map and Promise.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;
}

You could also try writing it like this so that you don't wait for each response to complete before running the next 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);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM