Javascript承诺和控制台日志?

Javascript承诺和控制台日志?,javascript,promise,async-await,puppeteer,Javascript,Promise,Async Await,Puppeteer,我需要Javascript承诺方面的帮助 按钮是节点列表。我是从木偶演员那里得到的。 我需要一个带有特定文本的按钮列表。 我将按钮转换为实际按钮数组(): 我在数组中映射 将其转换为按钮 检查文本,如果文本不是我需要的,则返回null 我console.log按钮文本-它会显示我需要的文本-所以一切都很好 然后我增加计数器 并返回转换后的按钮 之后,我过滤数组-检查非空元素。 我希望goodButtons将只包含我需要的按钮,并带有正确的文本 但结果是 buttons 328 button:

我需要Javascript承诺方面的帮助

按钮是节点列表。我是从木偶演员那里得到的。
我需要一个带有特定文本的按钮列表。
我将
按钮
转换为实际按钮数组():

  • 我在数组中映射
  • 将其转换为按钮
  • 检查文本,如果文本不是我需要的,则返回null
  • console.log
    按钮文本-它会显示我需要的文本-所以一切都很好
  • 然后我增加计数器
  • 并返回转换后的按钮
  • 之后,我过滤数组-检查非空元素。 我希望
    goodButtons
    将只包含我需要的按钮,并带有正确的文本

    但结果是

    buttons 328
    button: Confirm
    button: Confirm
    ... 100 lines of "good button text" in total
    button: Confirm
    counter 0
    good buttons 328
    
    因此计数器不会增加一次(或者使用
    async
    /
    wait
    stuff和
    console.log
    有一个技巧,我丢失了它?
    但似乎
    goodButtons
    array以某种方式包含了所有按钮,尽管我登录到控制台的按钮文本似乎是正确的

    代码

    const buttons=wait page.$$('button[type=“button”]”)
    console.log('buttons',wait buttons.length)
    设计数器=0;
    让goodButtons=等待按钮.map(异步按钮=>{
    const btnText=wait page.evaluate(btn=>btn.innerText,按钮);
    if(!['Confirm'].includes(btnText))返回null
    柜台++
    console.log('按钮:',btnText)
    返回等待按钮
    }).filter(按钮=>button!==null)
    console.log('counter',counter)
    console.log('good buttons',wait goodButtons.length)
    
    UPD(在Felix Kling评论之后)

    let计数器=0;
    让goodButtons=buttons.map(异步按钮=>{
    const btnText=wait page.evaluate(btn=>btn.innerText,按钮);
    如果(!['Confirm'、'Пццццц')。包括(btnText))返回空值
    柜台++
    返回等待按钮
    })
    goodButtons=等待承诺。全部(goodButtons)
    goodButtons=goodButtons.filter(按钮=>button!==null)
    
    输出

    buttons 328
    counter 149
    good buttons 328
    
    buttons 328
    counter 149
    good buttons 149
    

    这是@Felix Kling的评论和@Ufuk的提示后的工作代码

    谢谢你们

    let计数器=0;
    让goodButtons=buttons.map(异步按钮=>{
    const btnText=wait page.evaluate(btn=>btn.innerText,按钮);
    如果(!['Confirm'、'Пццццц')。包括(btnText))返回空值
    柜台++
    返回等待按钮
    })
    goodButtons=等待承诺。全部(goodButtons)
    goodButtons=goodButtons.filter(按钮=>button!==null)
    
    输出

    buttons 328
    counter 149
    good buttons 328
    
    buttons 328
    counter 149
    good buttons 149
    

    async
    函数返回一个承诺

    因此
    buttons.map(异步函数)
    返回一个承诺数组,其中一些承诺是通过
    null
    实现的(通过从map函数返回
    null
    ),而所有其他承诺是通过返回提供给map函数的
    按钮
    元素句柄实现的

    您可以使用
    Promise.all
    将承诺数组转换为一个数组,从中可以过滤出
    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
    属性是一个数字,因此无需等待它

    类似地,Puppeter elementHandle对象中的
    按钮
    ,如果我正确阅读了文档,则这不是一个承诺,因此它也不需要
    等待

    (编辑:感谢Andrew p.-过滤器功能必须应用于阵列
    等待承诺返回。全部(..
    数组#map
    不返回承诺。你需要使用
    承诺。在
    中的所有
    按钮
    。filter
    调用实际上指的是一个承诺,它总是
    !==null
    。你能更具体一点吗?@FelixKling我将它改为
    goodButtons=wait promise.all(goodButtons)
    现在,
    计数器
    工作了-它显示了良好的按钮计数。但是
    良好的按钮
    数组仍然包含所有328个元素。感谢您的快速回复。我用新代码更新了问题,并输出了您在承诺后不过滤更新的代码。显然,我们应该这样包装它
    (等待承诺。所有(…)。过滤器(…)
    同意,我重新编写了您建议的编辑,但结果应该是等效的。谢谢。