猿问

嵌套等待无法正常工作 Puppeteer

在此代码中,我尝试过滤掉 ElementHandle 数组的部分内容。我检查它是否有效的方法是打印最终过滤数组的长度。应该是 4,而不是 30。


const ar = await page.$$("li[class*=react-job-listing]");

const shortArray = Array.from(ar).filter(async (el)=> {

    console.log((await (await el.getProperty("innerText")).jsonValue()).includes("Easy Apply"));

    return (await (await el.getProperty("innerText")).jsonValue()).includes("Easy Apply");


});

//console.log((await (await ar[0].getProperty("innerText")).jsonValue()).includes("Easy Apply"));

console.log(shortArray.length);

console.log('hello');

不幸的是,这就是结果。


30

hello

false

false

false

false

true

false

false

true

false

false

false

false

false

false

false

false

true

false

false

false

false

false

false

false

false

false

false

false

true

false

长度的控制台日志出现在过滤器执行之前,而它应该是最后一件事。


看来脚本并没有等待等待。一定是由于多重嵌套的等待造成的。但我不知道如何解决它。


我知道这真的很难看。但由于某些原因我现在无法使用 page.evaluate 和 DOM 函数。请暂时看一下。


长风秋雁
浏览 101回答 1
1回答

牛魔王的故事

这不是傀儡师的错。异步函数返回 Promise,因此在Array.from(ar).filter()每个 callbak 中都返回 thruthy 值,并且不会过滤掉任何内容。使用for..of循环进行异步操作更简单、更安全:import puppeteer from 'puppeteer';const browser = await puppeteer.launch();const html = `&nbsp; <!doctype html>&nbsp; <html>&nbsp; &nbsp; <head><meta charset='UTF-8'><title>Test</title></head>&nbsp; &nbsp; <body>&nbsp; &nbsp; &nbsp; <p>foo 1</p>&nbsp; &nbsp; &nbsp; <p>foo 2</p>&nbsp; &nbsp; &nbsp; <p>bar 1</p>&nbsp; &nbsp; &nbsp; <p>bar 2</p>&nbsp; &nbsp; </body>&nbsp; </html>`;try {&nbsp; const [page] = await browser.pages();&nbsp; await page.goto(`data:text/html,${html}`);&nbsp; const ar = await page.$$("p");&nbsp; const shortArray = [];&nbsp; for (const element of ar) {&nbsp; &nbsp; const text = await (await element.getProperty("innerText")).jsonValue();&nbsp; &nbsp; console.log(text, text.includes("foo"));&nbsp; &nbsp; if (text.includes("foo")) shortArray.push(element);&nbsp; }&nbsp; console.log(shortArray.length);&nbsp; console.log('hello');} catch(err) { console.error(err); } finally { await browser.close(); }foo 1 truefoo 2 truebar 1 falsebar 2 false2hello
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答