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(....)
添加回答
舉報