forEach循环中使用async,await关键字获取到的值总是最后一个?
allUrls.forEach(async (item,index)=>{
await page.goto(item.url);
let imgUrls = await page.evaluate(e=>{
let imgs = Array.from($('#picture').find("img"))
return imgUrls = imgs.map((item)=>{
let imgUrl = $(item).attr('src');
let imgAlt = $(item).attr('alt');
return {
imgUrl,imgAlt
}
})
});
allImgUrls = [...allImgUrls,...imgUrls];
});
allImgUrls,allUrls,imgUrls都是数组,循环allUrls根据每一项得到一个数组imgUrls然后整合进allImgUrls里面,但最终结果imgUrls都是allUrls最后一项得到的结果?
求大神解答
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
注明下这个是puppeteer吧...
forEach
是并发的,所以你的page还没有等前一个页面操作完(甚至还没有打开前面的页面)就跳到下一个页面了。等执行获取图片属性的操作时,page已经进入了最后一个页面...你需要使用
for
:如果你确实是要并发的话,就不能用一个page,而是要
let newPage=await browser.newPage(url);
,forEach就会一次性打开多个新页面了。可能会由于短时间请求过多被服务器拒绝,可以加上await sleep(index*5000)
,这样两个页面间打开的时间都会相差5s。for(let x of ar){...}
中使用 async/await