Как правильно зациклить данную функцию?

(async function main() { //объявляем асинхронную функцию
  for (let i = 0; i <= 5; i++) { //счетчик для перебора страниц
  var sitepage = 'site.com/' + i;} // объявляем переменную, хранящую url страницы, к которой отправляется запрос
const response = await fetch(sitepage);//отправляем запрос, используя в качестве url страницы переменную sitepage
const html = await response.text();//указываем получаемый тип данных
const doc = new DOMParser().parseFromString(html, 'text/html');//обрабатываем запрос с помощью DOMParser
const element = document.getElementById('elem'); //ищем искомый элемент на странице
let noelempages = []; // создаем массив, в котором будут сохраняться страницы, не содержащие искомого элемента
if (element != null) { //проверяем результат запроса
  noelempages.push(sitepage);} // добавляем url страницы, на которой отсутствует элемент, к массиву

alert(noelempages);// выводим массив на экран
})();

Alert упорно выдает только site.com/5, хотя на предыдущих страницах (site.com/1 и т.д. элемент "elem" также присутствует). Понимаю, что скорее всего дело в неправильно заданном цикле. Подскажите, пожалуйста, какой цикл здесь лучше использовать? Я перечитал около десяти схожих вопросов здесь, но когда попробовал добавить колбек как здесь Как последовательно вызвать асинхронную функцию с коллбеками? получил зависание devtools.


Ответы (2 шт):

Автор решения: Aziz Umarov

Может так?

(async function main() { //объявляем асинхронную функцию
 let noelempages = []; // создаем массив, в котором будут сохраняться страницы, не содержащие искомого элемента;tn nfr j
  for (let i = 0; i <= 5; i++) { //счетчик для перебора страниц
    var sitepage = 'site.com/' + i;
    const response = await fetch(sitepage);//отправляем запрос, используя в качестве url страницы переменную sitepage
    const html = await response.text();//указываем получаемый тип данных
    const doc = new DOMParser().parseFromString(html, 'text/html');//обрабатываем запрос с помощью DOMParser
    const element = doc.getElementById('elem'); //ищем искомый элемент на странице
    
    if (element != null) { //проверяем результат запроса
      noelempages.push(sitepage);} // добавляем url страницы, на которой отсутствует элемент, к массиву
  } // объявляем переменную, хранящую url страницы, к которой отправляется запрос
  
  alert(noelempages);// выводим массив на экран
})();

→ Ссылка
Автор решения: Grundy

Вся проблема заключается в неверном форматировании.

Если отформатировать код, видно, что внутри цикла находится всего одна строчка

var sitepage = 'site.com/' + i;

Следовательно, последнее значение с i==5 и будет использовано в единственном запросе.

(async function main() { //объявляем асинхронную функцию
  for (let i = 0; i <= 5; i++) { //счетчик для перебора страниц
    var sitepage = 'site.com/' + i;
  } // цикл закончился.

  const response = await fetch(sitepage); //отправляем запрос, используя в качестве url страницы переменную sitepage
  const html = await response.text(); //указываем получаемый тип данных
  const doc = new DOMParser().parseFromString(html, 'text/html'); //обрабатываем запрос с помощью DOMParser

  /********************************************************/
  // если была идея искать в полученном документе, вместо `document`
  // надо было использовать `doc`, полученный на предыдущем шаге.
  const element = document.getElementById('elem'); //ищем искомый элемент на странице
  /********************************************************/

  let noelempages = []; // создаем массив, в котором будут сохраняться страницы, не содержащие искомого элемента

  if (element != null) { //проверяем результат запроса
    noelempages.push(sitepage);
  } // добавляем url страницы, на которой отсутствует элемент, к массиву

  alert(noelempages); // выводим массив на экран
})();

Для решения достаточно внести запросы внутрь цикла

(async function main() { //объявляем асинхронную функцию
    let noelempages = []; // создаем массив, в котором будут сохраняться страницы, не содержащие искомого элемента

    for (let i = 0; i <= 5; i++) { //счетчик для перебора страниц
        var sitepage = 'site.com/' + i;

        const response = await fetch(sitepage); //отправляем запрос, используя в качестве url страницы переменную sitepage
        const html = await response.text(); //указываем получаемый тип данных
        const doc = new DOMParser().parseFromString(html, 'text/html'); //обрабатываем запрос с помощью DOMParser

        /********************************************************/
        // если была идея искать в полученном документе, вместо `document`
        // надо было использовать `doc`, полученный на предыдущем шаге.
        const element = document.getElementById('elem'); //ищем искомый элемент на странице
        /********************************************************/

        if (element != null) { //проверяем результат запроса
            noelempages.push(sitepage);
        } // добавляем url страницы, на которой отсутствует элемент, к массиву

    } // цикл закончился.

    console.log(noelempages); // выводим массив на экран
})();
→ Ссылка