Javascript Puppeter-如何在setTimeout内返回page.evaluate中的结果
我正在用Puppeter向底部滚动一页,当我按下一个键时,我想退出函数并返回结果 这个脚本几乎可以工作,除了我不能返回值和脚本的结尾Javascript Puppeter-如何在setTimeout内返回page.evaluate中的结果,javascript,node.js,web-scraping,puppeteer,setinterval,Javascript,Node.js,Web Scraping,Puppeteer,Setinterval,我正在用Puppeter向底部滚动一页,当我按下一个键时,我想退出函数并返回结果 这个脚本几乎可以工作,除了我不能返回值和脚本的结尾 const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({ headless: false,
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: false,
userDataDir: "C:\\Users\\johndoe\\AppData\\Local\\Google\\Chrome\\User Data\\Default"
});
const page = await browser.newPage();
await page.setViewport({
width: 1920,
height: 1080,
deviceScaleFactor: 1,
});
await page.goto('https://www.facebook.com/groups/0000000/members',{waitUntil: 'networkidle0'});
let rawMembers = await page.evaluate(() => {
const intervall = 3000;
let stop = false;
document.addEventListener('keypress', e => stop = true); //press a key to exit
let results = [];
let i = 0;
let pageHeigth = 0;
let timerId = setTimeout(function tick() {
if ((stop === false) && (document.body.scrollHeight > pageHeigth)){
pageHeigth = document.body.scrollHeight //save the current page heigth
document.scrollingElement.scrollTop = pageHeigth; //move the scroll to the end of the page (page visible size), this will couse new content to be loaded - virtula scroll)
results.concat(pageHeigth); //<--- it should be the results
timerId = setTimeout(tick, intervall); //schedule a new timeout to repeat the function
}
else
{
clearTimeout(timerId)
return results;
}
}, intervall);
});
console.log('END')
//await browser.close();
})();
const puppeter=require('puppeter');
(异步()=>{
const browser=wait puppeter.launch({
无头:错,
userDataDir:“C:\\Users\\johndoe\\AppData\\Local\\Google\\Chrome\\User Data\\Default”
});
const page=wait browser.newPage();
等待page.setViewport({
宽度:1920,
身高:1080,
设备比例系数:1,
});
等待页面。转到('https://www.facebook.com/groups/0000000/members“,{waitUntil:'networkidle0'});
让rawMembers=wait page.evaluate(()=>{
常数间隔=3000;
让停止=错误;
document.addEventListener('keypress',e=>stop=true);//按一个键退出
让结果=[];
设i=0;
设pageHeigth=0;
let timerId=setTimeout(函数tick(){
if((stop==false)&&(document.body.scrollHeight>pageHeigth)){
pageHeigth=document.body.scrollHeight//保存当前页面高度
document.scrollingElement.scrollTop=pageHeigth;//将滚动条移动到页面末尾(页面可见大小),这将导致加载新内容-virtula scroll
results.concat(pageHeigth);//concat
方法返回一个新数组。它不会修改现有数组。调用concat
方法时,需要将其分配给变量。因此,这可能会解决问题
results.concat(pageHeight) //instead of this
let finalResult = results.concat(pageHeight) // you need to do this
其他方式,结果
数组始终为空,因为concat
方法不会修改数组。
这是文件
最后,您需要返回finalResult
而不是results
。您可以返回一个承诺,并在计时器终止时解决它(另外,如另一个答案中所述,concat()
在此处不适合,您可以使用推送
):
constrawmembers=page.evaluate(()=>newpromise((解析)=>{
常数间隔=3000;
让停止=错误;
document.addEventListener('keypress',()=>{stop=true;});
常量结果=[];
设pageHeigth=0;
let timerId=setTimeout(函数tick(){
if(stop==false&&document.body.scrollHeight>pageHeigth){
pageHeigth=document.body.scrollHeight;
document.scrollingElement.scrollTop=页面高度;
结果:推(页面高度);
timerId=setTimeout(滴答、间隔);
}否则{
清除超时(timerId);
决心(结果);
}
},间隔);
}));
谢谢你的建议我尝试了一个承诺并且有效!但是为什么没有承诺也有效?不确定我是否理解正确。你有没有一个没有承诺的变体也有效(返回结果
)?不,我错了!它只对承诺有效,就像你说的!谢谢,好的)祝你好运)