我一直在 nodejs 中嘗試 puppetter 包,當我使用資料函式時,與 for 回圈相比,它的作業方式大不相同
這就是我所說的:
地圖功能
data.map(async(info) =>{
let browser = await puppeteer.launch({ ignoreHTTPSErrors: true });
let page = await browser.newPage();
await page.goto(info.url, { waitUntil: "networkidle2" })
await page.screenshot({ path: info.src })
await browser.close();
})
console.log("map function completed");
這是地圖函式的輸入:
地圖功能完成
第一張截圖已保存
第二張截圖已保存
For 回圈是這樣作業的:
let browser = await puppeteer.launch({ ignoreHTTPSErrors: true });
let page = await browser.newPage();
for (let i = 0; i<=data.length-1; i ) {
console.log(data[i].url);
await page.goto(data[i].url, { waitUntil: "networkidle2" })
await page.screenshot({ path: data[i].src })
}
await browser.close();
console.log("for loop completed");
這是 for 回圈的輸入:
第一張截圖已保存
第二張截圖已保存
for回圈完成
為什么會這樣?我認為它們以相同的方式作業。如果有人解釋為什么會這樣,我想知道。
uj5u.com熱心網友回復:
如果你想讓它以同樣的方式作業,你必須以這種方式更改你的第一個代碼
const promises = data.map(async(info) =>{
let browser = await puppeteer.launch({ ignoreHTTPSErrors: true });
let page = await browser.newPage();
await page.goto(info.url, { waitUntil: "networkidle2" })
await page.screenshot({ path: info.src })
await browser.close();
})
await Promise.all(promises)
console.log("map function completed");
當您使用map并且async您的專案被轉換為承諾并且它們將并行執行時(在您的情況下這不是真的,因為您正在使用 puppeteer)所以您必須await解決所有問題以記錄成功訊息。
您的第二個代碼更加同步,因為它都是同一個函式中的所有包裝器,并且每個代碼await都一個接一個地執行
uj5u.com熱心網友回復:
在第一種情況下,因為您在函式中使用了異步函式map,所以第一個同步console.log()函式有效。因為通常異步操作是在同步操作之后進行的。
在第二種情況下for loop,頂層 await 和console.log()函式按順序作業,因為它們是同步的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/474705.html
標籤:javascript 节点.js 反应 npm
上一篇:無法創建反應專案
