forEach循环中使用async,await关键字获取到的值总是最后一个?

发布于 2022-09-06 13:17:53 字数 660 浏览 22 评论 0

   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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你是暖光i 2022-09-13 13:17:53

注明下这个是puppeteer吧...
forEach是并发的,所以你的page还没有等前一个页面操作完(甚至还没有打开前面的页面)就跳到下一个页面了。等执行获取图片属性的操作时,page已经进入了最后一个页面...
你需要使用for:

for(let index=0;index<allUrls.length;index++){
    let item=allUrls[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];

}

如果你确实是要并发的话,就不能用一个page,而是要let newPage=await browser.newPage(url);,forEach就会一次性打开多个新页面了。可能会由于短时间请求过多被服务器拒绝,可以加上await sleep(index*5000),这样两个页面间打开的时间都会相差5s。

回眸一笑 2022-09-13 13:17:53

for(let x of ar){...} 中使用 async/await

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文