Я пишу скрипт, который будет прокручивать страницу вниз, чтобы полностью загрузить ее для дальнейшей обработки, со следующей очень простой функцией, прокрутка прыгает вниз, но не может загрузить все между ними.
while(document.documentElement.scrollTop <= document.body.scrollHeight-500){
window.scrollTo(0, document.documentElement.scrollTop+500);
}
поэтому я изменил его с помощью setTimeout
, чтобы он прокручивался медленнее и давал время странице загрузить свои материалы.
while (document.documentElement.scrollTop <= document.body.scrollHeight - 500) {
setTimeout(
function() {
window.scrollTo(0, document.documentElement.scrollTop + 500);
}, 300);
}
Теперь это заканчивается бесконечным циклом, как я предполагаю, из-за асинхронного выпрыгивания из while.
Как изменить приведенный выше скрипт, чтобы он медленно прокручивался вниз, чтобы он загружал все? Или просто заставить страницу загрузить все каким-то другим способом
Один из вариантов — поместить его в функцию async
и await
промис, который разрешается через 300 мс внутри while
:
const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
(async () => {
while (document.documentElement.scrollTop <= document.body.scrollHeight - 500) {
window.scrollTo(0, document.documentElement.scrollTop + 500);
await delay(300);
}
})();
setTimeout(func, n)
очереди func
для вызова (минимум) н мс.
поэтому ваш второй подход в основном
while (document.documentElement.scrollTop <= document.body.scrollHeight - 500) {
addAnotherTimeout();
}
Код внутри цикла не влияет на состояние цикла, поэтому здесь получается бесконечный цикл.
Здесь рекурсивная версия (вроде):
var scrollTimeout;
function scrollElement(){
clearTimeout(scrollTimeout);
if (document.documentElement.scrollTop <= document.body.scrollHeight-500){
window.scrollTo(0, document.documentElement.scrollTop+500);
scrollTimeout = setTimeout(scrollElement, 300);
}
}
// start the scrolling:
scrollElement();
Часть с clearTimeout()
в начале scrollElement()
не требуется для самого цикла/рекурсии, но для предотвращения нескольких одновременных циклов.
Если вы начинаете второй цикл, а предыдущий еще не закончен, уничтожьте предыдущий.
Цикл while блокирует выполнение, и функция timed никогда не выполняется.