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

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

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

回答
編輯回答
礙你眼

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

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

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

}

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

2017年1月19日 02:52