En el fragmento a continuación, quiero poder acceder a locationArray fuera de la función de solicitud, entiendo que en mi código a continuación por qué no funcionará, sin embargo, probé muchos métodos diferentes para acceder a la matriz. He intentado usar promesas, funciones de devolución de llamada, etc., sin embargo, ninguno de ellos parece estar funcionando.
¿Alguna otra idea sobre cómo hacer esto? Incluso abierto a formas que he probado ya que en este punto todo vale la pena intentarlo.
request(process.env.RESOURCE_SHEET, (error, response, html) => { var locationArray = new Array if(!error && response.statusCode == 200) { const $ = cheerio.load(html); $("h3").each((i, lle) => { const location = $(lle).text(); if(location.includes("Kansas")) return; if(location.includes("In Stock")) { var level = location + " ✅"; } else { var level = location + " ❌"; } locationArray.push(level); }); } console.log(locationArray) // Output 1: [level1,level2,level3,leveletc] }); console.log(locationArray) // Output 2: []@StackSlave tenía razón, solo necesitaba una promesa, creo que arruiné la sintaxis cuando intenté resolverlo por primera vez usando una promesa, pero esto pareció funcionar.
const promise = new Promise((resolve,reject) => { request(process.env.RESOURCE_SHEET, (error, response, html) => { var locationArray = new Array if(!error && response.statusCode == 200) { const $ = cheerio.load(html); $("h3").each((i, lle) => { const location = $(lle).text(); if(location.includes("Kansas")) return; if(location.includes("In Stock")) { var level = location + " ✅"; } else { var level = location + " ❌"; } locationArray.push(level); resolve(locationArray); }); } console.log(locationArray) // Output 1: [level1,level2,level3,leveletc] }); }); promise.then(array => { console.log(array); });Uno no solo podría considerar un enfoque basado en promesas, como ya se sugirió, sino también una refactorización de código que separa las diferentes preocupaciones en tareas e implementa estas últimas como funciones que se pueden alimentar/pasar a la cadena de promesas. Como ventaja, la refactorización se recupera con un código legible por humanos que también podría ser más fácil de mantener...
function createRequest(src) { return new Promise((resolve, reject) => { request(src, (error, response, html) => { if (!error && response.statusCode === 200) { resolve(html); } else { reject({ error, response }); } }); }; } function handleFailedRequest(reason) { const { error, response } = reason; // proceed with failure handling based on // either request data `error` and/or `response`. } function createLocationArray(html) { const locationArray = []; const $ = cheerio.load(html); $('h3').each((i, lle) => { const location = $(lle).text(); if (!location.includes('Kansas')) { const isInStock = location.includes('In Stock'); locationArray.push( `${ location } ${ isInStock && '✅' || '❌' }` ); } }); return locationArray; } function processLocationArray(array) { console.log('locationArray ... ', array); } const promisedResponse = createRequest(process.env.RESOURCE_SHEET); promisedResponse .then(createLocationArray) .then(processLocationArray) .catch(handleFailedRequest);