zoukankan      html  css  js  c++  java
  • nodejs的process.on('message')转promise

    // 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);
    }
    

      

  • 相关阅读:
    如何访问到静态的文件,如jpg,js,css?
    内存定位
    虚拟机逃逸
    OpenGL
    测试
    unity3d
    磁力链接
    IDA脚本
    投屏神器
    扫二维码登录
  • 原文地址:https://www.cnblogs.com/zh33gl/p/8422663.html
Copyright © 2011-2022 走看看