// main.js
const cp = require('child_process');
const child = cp.fork('./child.js');
const callbackPool = {};
child.on('message', msg => {
let msgId = msg._id,
cb = callbackPool[msgId];
if (cb) {
cb.resolve(msg);
clearTimeout(cb.timer);
callbackPool[msgId] = null;
}
});
Promise.all([
sendMessage({timeout: 1e3}),
sendMessage({timeout: 2e3}),
sendMessage({timeout: 2e3}),
sendMessage({timeout: 1e3}),
]).then(rv => {
log(rv);
}).catch(err => {
log(err);
})
function sendMessage(msg, cb) {
msg._id = (Math.random() * 1e6) | 0;
child.send(msg);
log('sent', msg);
return new Promise((resolve, reject) => {
let msgId = msg._id,
timer = setTimeout(function() {
let cb = callbackPool[msgId];
if (cb) {
clearTimeout(cb.timer);
callbackPool[msgId] = null;
}
reject('timeout');
}, 5e3);
callbackPool[msgId] = { resolve, reject, timer };
});
}
function log(...args) {
args.unshift(new Date().toLocaleString());
console.log.apply(console, args);
}
// child.js
process.on('message', msg => {
doReply(msg);
});
function doReply(msg){
setTimeout(() => {
msg.data = msg._id * 2;
sendMessage(msg);
}, (msg.timeout || 0) * 2);
}
function sendMessage(msg){
process.send(msg);
}