esta es mi primera publicación de stackoverflow. En esta aplicación NodeJS, el objetivo es obtener el valor máximo de memoria disponible de un grupo de IP. Sé que puedo usar la función getMemory con una devolución de llamada, pero no sé cómo usarla en este escenario.
decide(){ for(var i=0;i < raspberrys.length;i++ ){ let ip = raspberrys[i]; let freeSpace = this.obtainMemory(ip); console.log(freeSpace); } },obtainMemory(ip){ https.get('http://'+ip+':3030/memory', (response)=>{ let data=''; response.on('data', (chunk) =>{ data+=chunk; }); response.on('end',()=>{ let obj = JSON.parse(data); console.log(obj.free ); return obj.free; }) }).on('error',(error)=>{ console.log(error); }); }Por ejemplo si tengo 2 raspberrys de 2GB y 1MB, tengo que devolver la IP de la primera raspberry. Gracias.
Solo para hacerlo más fácil, transformaría el get en una promesa. Puede hacerlo instalando alguna biblioteca como got , node-fetch o axios . Si tiene acceso al node 17.5 , puede usar la búsqueda, ahora nativa, puede ver cómo aquí . Hice una versión prometida de get también:
const get = (url) => { return new Promise((resolve, reject) => { let data = "" const req = https.get(url, (res) => { res.on("data", (chunk) => (data += chunk)) res.on("error", (err) => reject(err)) res.on("end", () => { data = JSON.parse(data) return resolve(data) }) }) req.on("error", reject) req.end() }) }Puede encontrar una versión más completa aquí .
usándolo tu código:
async function decide() { // get all raspberrys free memory const freeMemories = await Promise.all(raspberrys.map(obtainMemory)) // find which one has the biggest memory const { ip } = freeMemories.reduce( (prev, curr) => { if (prev.memory < curr.memory) prev = curr return prev }, { memory: 0 } ) console.log(ip) } async function obtainMemory(ip) { const ipAddress = `http://${ip}:3030/memory` const { free } = await get(ipAddress) // using the get function that I defined return { ip, free } }