Я не могу правильно обернуть голову вокруг обратных вызовов / таймеров, поэтому продолжаю работать со следующим.
Я хочу собрать все ссылки / URL-адреса на веб-странице, однако у веб-страницы есть одна из них, которая позволяет загружать больше контента, когда вы прокручиваете страницу до тех пор, пока больше не будет больше ничего отображать / загружать. Я могу добиться этого в Javascript с помощью .scrollIntoView ()
Следующий код используется для определения того, достиг ли я конца страницы, и больше нет доступных результатов для загрузки.
var element = document.getElementById('browse_end_of_results_footer');
if (typeof(element) != 'undefined' && element != null) {
console.log('end');
} else {
console.log('scroll');
document.getElementById("pagelet_dock").scrollIntoView();
}
Однако мне нужно продолжать цикл с задержкой в 1 секунду, пока либо не будет достигнут конец, либо будет предпринято несколько попыток, чтобы он не работал вечно, но мне нужно также собирать ссылки / URL-адреса внутри цикл и когда выполняется любое из условий (максимальное количество попыток / конец), результаты возвращаются.
Следующее - это то, что мне удалось получить, взломав некоторый пример кода вместе, но, как я изначально указал, я не могу разобраться с обратными вызовами и таймерами Javascript.
var myVar = setInterval(myTimer, 1000);
function myTimer() {
var i = 0;
var d = new Date();
var t = d.toLocaleTimeString();
console.log(t)
i++;
var element = document.getElementById('browse_end_of_results_footer');
if (typeof(element) != 'undefined' && element != null) {
console.log('end');
myStopFunction();
} else {
console.log('scroll');
document.getElementById("pagelet_dock").scrollIntoView();
}
}
function myStopFunction() {
clearInterval(myVar);
}
РЕДАКТИРОВАТЬ: удалось получить следующий код для работы, однако кто-нибудь порекомендовал бы лучший способ.
const sleep = (milliseconds) => {
return new Promise(resolve => setTimeout(resolve, milliseconds))
}
const pageDown = async () => {
var element = document.getElementById('browse_end_of_results_footer');
if (element) {
console.log('Reached Bottom');
return true;
}
console.log('Scrolling');
document.getElementById("pagelet_dock").scrollIntoView();
return false;
}
var maxAttempts = 5;
var items =[];
var bottom = false;
var attemptCounter = 0;
while (!bottom && attemptCounter < maxAttempts ) {
attemptCounter++;
bottom = await pageDown();
x = document.querySelectorAll('div[data-bt*="rank"]');
for (var i = items.length; i < x.length; i++) {
var jsonString = x[i].getAttribute('data-bt');
var data = JSON.parse(jsonString);
items.push(data.id);
}
await sleep(1000);
}
console.log(items);