Soy nuevo en el uso de tenedores y me preguntaba
si hay una forma de esperar a que el proceso principal envíe datos al proceso secundario?
tal vez algo como esto
índice.js:
var fork = require('child_process').fork; var child = fork(__dirname + '/index 2.js'); child.on('message', function (response) { console.log(response); }); async function out(){ child.send(50); await new Promise(r => setTimeout(r, 3000)); //sleeps for 3000ms child.send(30); } out();index2.js:
let a=0; function wait_and_listen(){ let temp_data; process.on('message',(data)=>{temp_data=data}); return temp_data; } a+=wait_and_listen(); a-=wait_and_listen(); process.send(a); process.exit();Puede usar la promesa en el script de su hijo para esperar a que el padre envíe datos
No estoy seguro, pero tal vez algo como esto:
let a = 0; async function wait_and_listen() { return await new Promise((resolve) =>{ process.on('message', (data) => { resolve(data); }); }); } (async()=>{ a += await wait_and_listen(); a -= await wait_and_listen(); process.send(a); process.exit(); })(); Editar:
de acuerdo con OP, la solución anterior crea múltiples oyentes, por lo que para evitar eso, use .once en lugar de .on de esta manera:
let a = 0; async function wait_and_listen() { return await new Promise((resolve) =>{ process.once('message', (data) => { resolve(data); }); }); } (async()=>{ a += await wait_and_listen(); a -= await wait_and_listen(); process.send(a); process.exit(); })();simplemente usa el "process.on('message') una vez y cuenta sus llamadas.
// variable to detect if its the first call let nthcall = 0; // variable to accumulate data let a = 0; // work functon to be called when data is received from the parent function work(data) { nthcall++; // feel free to do wwhatever you like with your data depending on nthcall value a += data; if (nthcall == 1) { console.log('first time i got data', data); return; } if (nthcall == 4) { console.log('last time i got data', data); process.send(a); process.exit(0); } console.log('i got data', data); } process.on('message', work);