Асинхронное ожидание не ждет завершения функции - PullRequest
0 голосов
/ 22 января 2019

Я использую fetch для получения данных для каждого элемента массива. Эти значения помещаются в массив, и я хочу вернуть максимум этих значений после извлечения всех значений.

Для этого я использовал обещание:

 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 голосов
/ 22 января 2019

Если вы собираетесь писать код, который использует async, вы должны использовать async.Если это необходимо выполнить синхронно, вы можете ожидать внутри цикла for.Если вы хотите, чтобы все они запускались одновременно, используйте map и 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;
}

. Вы также можете попробовать написать это так, чтобы не ждать завершения каждого ответа перед запускомследующий 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);
}
...