// 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);}
nodejs的process.on('message')转promise
原文地址:https://www.cnblogs.com/zh33gl/p/8422663.html