He estado probando el paquete puppetter en nodejs, y cuando uso la función de datos funciona bastante diferente en contraste con for loop
esto es de lo que estoy hablando:
función de mapa
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");esta es la entrada de la función map:
función de mapa completada
primera captura de pantalla guardada
segunda captura de pantalla guardada
For loop funciona así:
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");esta es la entrada del bucle for:
primera captura de pantalla guardada
segunda captura de pantalla guardada
bucle for completado
¿Por qué está pasando esto? Pensé que funcionaban de la misma manera. Me gustaría si alguien explica por qué es esto.
si desea que funcione de la misma manera, debe cambiar su primer código de esta manera
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"); cuando usa map y async , sus elementos se transforman en promesas y se ejecutarán en paralelo (en su caso, eso no es cierto porque está usando titiritero), por lo que debe await a que todos se resuelvan para registrar el mensaje de éxito.
Su segundo código es más síncrono porque es todo envoltorio en la misma función y cada await se ejecuta una tras otra.
En el primer caso, debido a que utiliza una función asíncrona dentro de la función de map , funciona la primera función sincrónica console.log() . Porque normalmente la operación asíncrona funciona después de la operación síncrona.
En el segundo caso, el for loop , la espera de nivel superior y la función console.log() funcionan de forma secuencial porque son sincrónicas.