2 回答
TA贡献1803条经验 获得超3个赞
let counter = 0;
let goodButtons = buttons.map(async button => {
const btnText = await page.evaluate(btn => btn.innerText, button);
if (!['Confirm', 'Подтвердить'].includes(btnText)) return null
counter++
return await button
})
goodButtons = await Promise.all(goodButtons)
goodButtons = goodButtons.filter(button => button !== null)
输出
buttons 328
counter 149
good buttons 149
TA贡献1802条经验 获得超4个赞
async函数返回一个承诺。
因此buttons.map( async function)返回一个promise数组,其中一些已经实现null(通过null从map函数返回),而所有其他的已经通过返回button提供给map函数的元素句柄来实现。
您可以使用Promise.all将 Promise 数组转换为可以从中过滤出null值的数组:
let counter = 0;
let goodButtons = (await Promise.all(
buttons.map(async button => {
const btnText = await page.evaluate(btn => btn.innerText, button);
if (!['Confirm', 'Подтвердить'].includes(btnText)) return null
counter++
return button
}))
.filter(button => button !== null)
请注意,length数组的属性是一个数字,因此不需要await它。
同样button,在 puppeteer elementHandle 对象中,如果我正确阅读了文档,这不是一个承诺,所以它也不应该await在它之前要求。
(编辑:感谢 Andrew P. - filter 函数必须应用于返回的数组await Promise.all(....)
添加回答
举报