Javascript承诺和控制台日志?
我需要Javascript承诺方面的帮助Javascript承诺和控制台日志?,javascript,promise,async-await,puppeteer,Javascript,Promise,Async Await,Puppeteer,我需要Javascript承诺方面的帮助 按钮是节点列表。我是从木偶演员那里得到的。 我需要一个带有特定文本的按钮列表。 我将按钮转换为实际按钮数组(): 我在数组中映射 将其转换为按钮 检查文本,如果文本不是我需要的,则返回null 我console.log按钮文本-它会显示我需要的文本-所以一切都很好 然后我增加计数器 并返回转换后的按钮 之后,我过滤数组-检查非空元素。 我希望goodButtons将只包含我需要的按钮,并带有正确的文本 但结果是 buttons 328 button:
按钮是节点列表。我是从木偶演员那里得到的。
我需要一个带有特定文本的按钮列表。
我将按钮
转换为实际按钮数组():
- 我在数组中映射
- 将其转换为按钮
- 检查文本,如果文本不是我需要的,则返回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个元素。感谢您的快速回复。我用新代码更新了问题,并输出了您在承诺后不过滤更新的代码。显然,我们应该这样包装它(等待承诺。所有(…)。过滤器(…)
同意,我重新编写了您建议的编辑,但结果应该是等效的。谢谢。