El código actual que estoy usando:
async function MainFunction(){ let arrOO; process.on('message', (jData) => { let sName; if(jData.koota){ sName = jData.koota[0] } console.log(sName + ' hello!') arrOO = sName }) console.log(arrOO + ' calling outside of .on') } Estoy intentando imprimir jData.koota[0] que está asignado a sName para que pueda usarse en toda la función. En este caso, fuera del proceso.on, quiero imprimirlo. Cuando se ejecuta este código, se devuelve 'indefinido' en console.log(arrOO + ' calling outside of .on') . ¿Cómo llamaría a sName fuera de process.on?
process.on() simplemente instala un detector de eventos e inmediatamente regresa, por lo que su console.log() se ejecuta ANTES de que ocurra cualquier evento. process.on() se conoce como no bloqueante. Eso significa que hace un trabajo inicial y luego regresa inmediatamente y los datos reales llegan un tiempo después cuando llama a su devolución de llamada.
Por lo tanto, su console.log() solo está intentando ver los datos antes de que se hayan ingresado allí. Tenga en cuenta que la mayoría de las veces, cuando intenta asignar una variable de mayor alcance desde una función de devolución de llamada asincrónica, es probable que se trate de un error de codificación porque el código en el mayor alcance no tendrá idea de cuándo acceder a esos datos.
Para cualquier código que quiera saber sobre esos mensajes de proceso, debe colocar ese código dentro de la devolución de llamada process.on() o ponerlo en una función a la que llama desde dentro de esa devolución de llamada. Esa es la ÚNICA forma en que sabrá cuándo se ha producido un mensaje entrante y cuándo hay algunos datos disponibles.
Aquí hay una opción:
function MainFunction(){ process.on('message', (jData) => { let sName; if(jData.koota){ sName = jData.koota[0]; // call some function and pass it the new data newDataArrived(sName) } }); } // this function gets called when we have a new sName function newDataArrived(sName) { // put code here that uses the data console.log(sName); }O bien, puede convertirlo en una interfaz basada en promesas que resuelva una promesa en el próximo evento coincidente que obtenga:
function MainFunction() { return new Promise(resolve => { function messageHandler(jData) { if (jData.koota) { resolve(jData.koota); // remove message listener so they don't pile up // since a promise is a one-shot device, we can // only use this promise once process.off('message', messageHandler); } } process.on('message', messageHandler); }); } Mainfunction().then(sName => { // use sName here });