-1

Необходимо получить результат последней итерации цикла for

const arraySuccess = []
const pages = Number(document.querySelector('.page') + 1
for (let i = 1; i < pages; i++) {
async function getResponse() {
const href = document.location.href
const urlResponse = `${href}&page=${i}`
const urlRequest = await fetch(urlResponse)
const requestBody = await urlRequest.text()
const parser = new DOMParser()
const outer = parser.parseFromString(requestBody, "text/html")
const takeSuccess = Array.from(outer.querySelectorAll('.success'))
arraySuccess.push(takeSuccess)
} getResponse()

Этот код выведет в консоль столько логов, сколько страниц в документе, мне необходимо получит только лишь конечный результат, с помощью метода .push я добавляю на каждой итерации элемент в массив, но при этом из-за области видимости цикла, я не могу получить весь массив как конечный результат, то есть если я вне цикла выведу console.log(arraySuccess) я получу все тот же пустой массив, даже если буду устанавливать задержку, он не успевает запушить прежде чем лог запустится. Мне необходимо получить в консоль результат конечной итерации цикла, то есть чтобы все эти '.reviews-success' были в одном массиве arraySuccess

P.S пагинация на сайте реализована с помощью href и необходимо поочередно выполнять запросы.

  • при этом из-за области видимости цикла, я не могу получить весь массив как конечный результат - это неверное утверждение. В приведенном, неполном(sic!), куске кода в цикле просто объявляется функция. Неизвестно что с ней происходит, скорее всего она даже не вызывается. Очевидно, что в этом случае arraySuccess останется пустым – Grundy Jan 19 '24 at 23:02
  • Что интересно, первый блок кода абсолютно никак не связан с вопросом и в текущем виде только мешает понять суть вопроса. – Grundy Jan 19 '24 at 23:03
  • @Grundy снова приветствую! Я первый код привел чтобы было проще понять какой конечный результат я хочу получить, в моем примере точно так же нужно просто получить последнее значение всего цикла, это будет решением моего вопроса по-сути, забыл добавить вывод функции, исправил ) – Apache207 Jan 19 '24 at 23:06
  • Существенная разница в том, что в твоем цикле функция асинхронная, а в первом блоке - синхронная. Из-за этого ответы абсолютно разные будут. – Grundy Jan 19 '24 at 23:08
  • @Grundy это да, это я не указал, но сама суть остается той же, на последней итерации нужное мне значение ) – Apache207 Jan 19 '24 at 23:11
  • Нет не той же. Почему-то во втором блоке ты догадался добавлять в массив, а в первом просто выводишь console.log. Фактически ты сам усложняешь задачу, давая код, который не связан с реальной задачей – Grundy Jan 19 '24 at 23:13
  • @Grundy я удалил чтобы не отвлекало – Apache207 Jan 19 '24 at 23:15

1 Answers1

1

В данном случае не происходит ожидание завершения асинхронной функции, поэтому цикл завершается до того, как выполнятся все запросы.

Вместо этого достаточно было использовать await и вернуть из функции результат:

  1. сделать функцию глобальной и принимающей номер страницы как параметр:

    async function getResponse(i) {
       const href = document.location.href
       const urlResponse = `${href}&page=${i}`
       const urlRequest = await fetch(urlResponse)
       const requestBody = await urlRequest.text()
       const parser = new DOMParser()
       const outer = parser.parseFromString(requestBody, "text/html")
       const takeSuccess = Array.from(outer.querySelectorAll('.success'))
       return takeSuccess  
    }
    
  2. цикл становится следующим

    for (let i = 1; i < pages; i++) {
       arraySuccess.push(await getResponse(i))
    } 
    
Grundy
  • 81,538
  • Ответ есть, но не совсем конечный результат, получил в итоге массив из двух массивов ) – Apache207 Jan 19 '24 at 23:34
  • @Apache207, результат тот же, что ты получил бы если бы операция была синхронная ¯\(ツ)/¯ если нужен плоский список, просто используй spread: .push(...await getResponse(i)) – Grundy Jan 20 '24 at 00:51
  • это полностью решило мой вопрос! Огромное Вам спасибо! – Apache207 Jan 21 '24 at 08:41