Подождите, пока l oop не завершится sh, прежде чем выполнять следующее действие - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть следующее l oop, которое извлекает данные и затем сохраняет их в переменной allVegetables. Мне нужно от l oop до fini sh, прежде чем я смогу записать длину массива. С помощью приведенного ниже кода я получаю ноль для длины allVegetables

var allVegetables = [];

for (var i = 0; i < 10; i++) {

  //fetch the next batches of vegetables
  fetch(`https://www.nofrills.ca/api/category/NFR001001002000/products?pageSize=48&pageNumber=${i}&sort=title-asc`, {
    "headers": {
      ...      
    },
    "referrer": "https://www.nofrills.ca/Food/Fruits-%26-Vegetables/Vegetable/c/NFR001001002000?sort=title-asc",
    "referrerPolicy": "no-referrer-when-downgrade",
    "body": null,
    "method": "GET",
    "mode": "cors"
  }).then(
    function (response) {
      if (response.status !== 200) {
        console.log('Looks like there was a problem. Status Code: ' +
          response.status);
        return;
      }

      response.json().then(function (data) {
        //ad the results of the data to the array
        allVegetables = allVegetables.concat(data.results);
      });
    })
};

console.log("number of vegetables are:", allVegetables.length);

В настоящее время журналы дают мне ноль, который я предполагаю, потому что он не ждет, пока l oop завершится sh заполняя массив allVegetables. Я также предполагаю, что должен использовать asyn c, но я новичок ie и не могу понять, как это сделать

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Попробуйте сохранить все запросы на выборку и их результаты в массиве. Это приведет к массиву обещаний. С этими обещаниями вы можете подождать, пока все завершатся sh с помощью Promise.all, обработать вывод всех ответов в одном go и сохранить их все в переменной allVegetables.

Поскольку в итоге вы получите массив массива, используйте Array.prototype.flat() для создания единого массива со всеми значениями, которые вы можете назначить переменной allVegetables.

let allVegetables = [];
let iterations = 10;

const requests = Array(iterations).fill().map((_, i) => fetch(`https://www.nofrills.ca/api/category/NFR001001002000/products?pageSize=48&pageNumber=${i}&sort=title-asc`, {
  "headers": {
    ...      
  },
  "referrer": "https://www.nofrills.ca/Food/Fruits-%26-Vegetables/Vegetable/c/NFR001001002000?sort=title-asc",
  "referrerPolicy": "no-referrer-when-downgrade",
  "body": null,
  "method": "GET",
  "mode": "cors"
}).then(response => {
  if (response.status !== 200) {
    throw new Error('Looks like there was a problem with request ${i}. Status Code: ' + response.status);
  }
  return response.json();
}).then(data => {
  return data.results;
});

const responses = Promise.all(requests).then(data => {
  allVegetables = [...allVegetables, ...data.flat()];
}).catch(error => {
  console.log(error);
});
0 голосов
/ 28 апреля 2020

Вы можете сохранить все свои обещания получения в массиве, а затем использовать Promise.allSettled, чтобы дождаться, пока они завершат свою работу sh.

Вот краткий пример:

const responses = [];
for (let i = 0; i < 4; i++) {
  responses.push(
    fetch("https://jsonplaceholder.typicode.com/posts/1").then(response =>
      response.json()
    )
  );
}
Promise.allSettled(responses).then(console.log);

Это будет регистрировать массив объектов с этой формой:

{
  status: 'string',
  value: Object
}

Являясь атрибутом 'value', содержащим информацию, полученную из выборки.

В вашем случае вы просто нужно проверить длину вашего массива.

Вы можете проверить пример на песочнице .

...