Estoy tratando de acceder a imgArr después de este ciclo, por supuesto, obtengo una matriz vacía porque console.log(imgArr) se ejecuta sincrónicamente con el ciclo for. Pero necesito que se imgArr para poder usarlo en otra lógica. No puedo usar setTimeout nuevamente porque no puedo saber cuánto tiempo se necesita para que se complete el ciclo. Traté de envolver todo esto dentro de una función y llamarlo dentro de otra función, pero fue en vano.
var imgArr = [] var nextBtn = document.querySelector('[aria-label="Next"]') for (var i = 0; i < 15; i++) { setTimeout(() => { if (nextBtn) { Object.values(document.querySelectorAll('img')).map(img => { if (imgArr.indexOf(img.src) === -1) imgArr.push(img.src) }); nextBtn.click(); nextBtn = document.querySelector('[aria-label="Next"]'); }; }, i * 1000); }; console.log(imgArr) // expected: [], needed: [element1, element2, ...]Puedes modificar tu código así
imgArray es una promesa, por lo que no puede acceder directamente al valor resuelto
var nextBtn = document.querySelector('[aria-label="Next"]') const imgArray = Promise.all(Array(15).fill(0).map((_, i) => new Promise(resolve => { let array = [] setTimeout(() => { if (nextBtn) { array = Object.values(document.querySelectorAll('img')).map(img => img.src); nextBtn.click(); nextBtn = document.querySelector('[aria-label="Next"]'); }; resolve(array) }, i * 1000); }))).then(data => [...new Set(data.flat())]) imgArray.then(d => console.log(d)) // expected: [], needed: [element1, element2, ...]La función se ejecuta antes de la llamada setTimeout, conviértala en Promise, será fácil de manejar
let result = []; const nextClick = (res) => { const nextBtn = document.querySelector('[aria-label="Next"]'); if (nextBtn) { const imgs = Object.values(document.querySelectorAll("img")); result = Array.from(new Set([...result, ...imgs.map((img) => img.src)])); nextBtn.click(); nextBtn = document.querySelector('[aria-label="Next"]'); } res(result); }; const wait = (ms) => new Promise((res) => setTimeout(() => nextClick(res), ms)); const promiseArr = new Array(15).fill(0).map((_, i) => wait(i * 1000)); Promise.all(promiseArr).then(() => console.log(result));