亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Javascript Promise 和控制臺日志?

Javascript Promise 和控制臺日志?

Helenr 2022-07-08 15:48:18
我需要有關 Javascript Promises 的幫助。-buttons是一個節點列表。我從puppeteer(API)得到它。我需要一個帶有特定文本的按鈕列表。我轉換buttons為真實按鈕數組(page.evaluate API 鏈接):我通過數組映射,將其轉換為按鈕,檢查文本,return null如果文本不是我需要的我console.log是按鈕文本 - 它向我顯示了我需要的文本 - 所以一切都很好。然后我增加counter并返回轉換后的按鈕。之后我過濾數組 - 檢查非空元素。我希望goodButtons它只包含我需要的按鈕 - 帶有正確的文本。但輸出是buttons 328button: Confirmbutton: Confirm... 100 lines of "good button text" in totalbutton: Confirmcounter 0good buttons 328所以計數器不會增加一次(或者async/await東西有一個技巧console.log,我錯過了?)但似乎goodButtons數組包含所有按鈕,盡管我在控制臺中登錄的按鈕文本似乎是正確的。編碼const buttons = await page.$$('button[type="button"]')console.log('buttons', await buttons.length)let counter = 0;let goodButtons = await buttons.map(async button => {    const btnText = await page.evaluate(btn => btn.innerText, button);    if (!['Confirm'].includes(btnText)) return null    counter++    console.log('button: ', btnText)    return await button}).filter(button => button !== null)console.log('counter', counter)console.log('good buttons', await goodButtons.length)UPD(在 Felix Kling 評論之后)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 328counter 149good buttons 328
查看完整描述

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


查看完整回答
反對 回復 2022-07-08
?
慕虎7371278

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(....)


查看完整回答
反對 回復 2022-07-08
  • 2 回答
  • 0 關注
  • 147 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號