Estoy tratando de ejecutar una solicitud HTTP 3 veces en node.js usando la biblioteca HTTPS incorporada, y cada ejecución tiene un conjunto diferente de opciones. Para pasar al siguiente conjunto de opciones después de completar una ejecución, estoy usando un bucle for que se incrementa una vez cada ejecución, para un total de 3 ejecuciones. Sin embargo, en lugar de esperar a que finalice cada ejecución antes de continuar en el bucle, se salta las dos primeras llamadas por completo y lo ejecuta 3 veces con el tercer conjunto de opciones. He buscado una respuesta por todas partes, ¿alguien tiene alguna idea/solución?
for(let i = 0; i < 3; i++) { option = i; console.log("Calling with option " + i) await http.request(options[i], res => { let resp = ''; res.on('data', function(chunk) { resp += chunk; }); res.on('end', async function () { let data = await JSON.parse(resp); if(option === 0) { //Bloxlink handler console.log("Case 1: Bloxlink") if(data.status === "error") { returndata += "Bloxlink returned no users" } else { returndata += "\nBloxlink returned user with ID " + data.primaryAccount + " and username " + await noblox.getUsernameFromId(parseInt(data.primaryAccount)) + "." } } else if(option === 1) { //RoWifi handler console.log("Case 2: RoWifi") if(data.success === false) { returndata += "RoWifi returned no users" } else { returndata += "\nRoWifi returned user with ID " + data.roblox_id + " and username " + await noblox.getUsernameFromId(data.roblox_id) + "." } } else if(option === 2) { //Eryn handler console.log("Case 3: Eryn") if(data.status === "error") { returndata += "Eryn returned no users" } else { returndata += "\nEryn returned user with ID " + data.robloxId + " and username " + data.robloxUsername + "." } } console.log(returndata); }); res.on('error', function () { channel.send('One or more APIs returned an error. The operation has been terminated.') }); }).end(); channel.send("Run " + i + " finished: " + returndata); console.log(returndata); }Podrías envolverlo en una promesa y luego esperarlo:
for(let i = 0; i < 3; i++) { option = i; console.log("Calling with option " + i) await new Promise((resolve, reject) => { http.request(options[i], res => { let resp = ''; res.on('data', function(chunk) { resp += chunk; }); res.on('end', async function () { let data = await JSON.parse(resp); if(option === 0) { //Bloxlink handler console.log("Case 1: Bloxlink") if(data.status === "error") { returndata += "Bloxlink returned no users" } else { returndata += "\nBloxlink returned user with ID " + data.primaryAccount + " and username " + await noblox.getUsernameFromId(parseInt(data.primaryAccount)) + "." } } else if(option === 1) { //RoWifi handler console.log("Case 2: RoWifi") if(data.success === false) { returndata += "RoWifi returned no users" } else { returndata += "\nRoWifi returned user with ID " + data.roblox_id + " and username " + await noblox.getUsernameFromId(data.roblox_id) + "." } } else if(option === 2) { //Eryn handler console.log("Case 3: Eryn") if(data.status === "error") { returndata += "Eryn returned no users" } else { returndata += "\nEryn returned user with ID " + data.robloxId + " and username " + data.robloxUsername + "." } } console.log(returndata); resolve(); }); res.on('error', function () { channel.send('One or more APIs returned an error. The operation has been terminated.') reject(); }); }).end(); }).then(() => { channel.send("Run " + i + " finished: " + returndata); console.log(returndata); }); } Pero un enfoque más limpio sería usar una biblioteca de solicitudes basada en promesas como fetch o axios .