Javascript Puppeter-如何在setTimeout内返回page.evaluate中的结果

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,

我正在用Puppeter向底部滚动一页,当我按下一个键时,我想退出函数并返回结果

这个脚本几乎可以工作,除了我不能返回值和脚本的结尾

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);
决心(结果);
}
},间隔);
}));

谢谢你的建议我尝试了一个承诺并且有效!但是为什么没有承诺也有效?不确定我是否理解正确。你有没有一个没有承诺的变体也有效(返回
结果
)?不,我错了!它只对承诺有效,就像你说的!谢谢,好的)祝你好运)