在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ forEach循環(huán)中使用async,await關(guān)鍵字獲取到的值總是最后一個?

forEach循環(huán)中使用async,await關(guān)鍵字獲取到的值總是最后一個?

   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都是數(shù)組,循環(huán)allUrls根據(jù)每一項得到一個數(shù)組imgUrls然后整合進allImgUrls里面,但最終結(jié)果imgUrls都是allUrls最后一項得到的結(jié)果?
求大神解答

回答
編輯回答
礙你眼

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

2018年9月17日 03:37
編輯回答
柒喵

注明下這個是puppeteer吧...
forEach是并發(fā)的,所以你的page還沒有等前一個頁面操作完(甚至還沒有打開前面的頁面)就跳到下一個頁面了。等執(zhí)行獲取圖片屬性的操作時,page已經(jīng)進入了最后一個頁面...
你需要使用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];

}

如果你確實是要并發(fā)的話,就不能用一個page,而是要let newPage=await browser.newPage(url);,forEach就會一次性打開多個新頁面了??赡軙捎诙虝r間請求過多被服務(wù)器拒絕,可以加上await sleep(index*5000),這樣兩個頁面間打開的時間都會相差5s。

2017年1月19日 02:52