Quiero iterar algunas URL de página, almacenadas en una matriz, y recuperarlas para realizar una operación sobre su archivo html. Como necesito almacenar un resultado de dicha operación para cada página para usarlos la próxima vez que llame a la función, quiero pasar el índice (i) en la llamada onResponse para que pueda asignar el resultado a su lugar adecuado en el formación. Pero en lugar de usar el valor i de la i-ésima iteración respectiva, esta llamada de función usa pages.length (el último valor de i). Sé por qué sucede esto, pero no sé cuál sería una buena solución. ¿Alguna ayuda aquí?
async function checkPages(){ const dateObj = new Date(); console.log(pages.length) console.log(`Time: ${dateObj.toTimeString()}\n`); for (var i = 0; i < pages.length; i++){ axios.get(pages[i], { httpsAgent }) .then(response => onResponse(response, i) ) .catch(function (error) { onError(error) }); }intenta usar let en lugar de var
for (let i = 0; i < pages.length; i++) { let tienen alcance de bloque y var tienen alcance de función.
Dado que está llamando a un método async , al usar var finalizará el ciclo for y pasará el último valor a la devolución de llamada. Pero usar let mantendrá la variable asignada en el alcance del bloque en la devolución de llamada.
axios.get es una promesa, por lo que su foreach está iniciando todas las solicitudes http y llego a la longitud de la matriz antes de i obtenga una respuesta de su API.
Probar:
async function checkPages() { const results = await Promise.all( pages.map((page) => axios.get(page, { httpsAgent }).catch((error) => { onError(error); }) ) ); results.forEach((response, i) => { onResponse(response, i); }); }