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

  

nodejs的process.on('message')转promise

原文地址:https://www.cnblogs.com/zh33gl/p/8422663.html

时间: 2024-10-29 19:06:54

nodejs的process.on('message')转promise的相关文章

解决"415 Cannot process the message because the content type 'application/x-www-form-urlencoded' was not the expected type 'text/xml; charset=utf-8'"

wcf basicHttpBinding content-type    text/xml;charset=utf-8 wsHttpBinding  'application/soap+xml; charset=utf-8' webHttpBinding 'application/x-www-form-urlencoded'   对应网页中的post请求 所以如果是post请求wcf服务,要使用webHttpBinding 解决"415 Cannot process the message be

nodejs的process模块如何获取其他进程的pid

var cmd=process.platform=='win32'?'tasklist':'ps aux'; var exec = require('child_process').exec; var qqname='qq'; exec(cmd, function(err, stdout, stderr) { if(err){ return console.log(err); } stdout.split('\n').filter(function(line){ var p=line.trim(

nodejs之process进程

虽然node对操作系统做了很多抽象的工作,但是你还是可以直接和他交互,比如和系统中已经存在的进程进行交互,创建工作子进程.node是一个用于事件循环的线程,但是你可以在这个事件循环之外创建其他的进程(线程)参与工作. 进程模块 process模块允许你获得或者修改当前node进程的设置,不想其他的模块,process是一个全局进程(node主进程),你可以直接通过process变量直接访问它. process实现了EventEmitter接口,exit方法会在当进程退出的时候执行.因为进程退出之

nodejs中function*、yield和Promise的示例

var co = require("co"); var fs = require("fs"); function cusReadFile(fileName) { //总之,要返回一个Promise对象,这样写也可以,因为fs.readFile返回的就是一个Promise对象 /** * return function(fn){ * fs.readFile(fileName,fn); * } */ return new Promise(function (resolv

[转]nodejs中的process模块--child_process.exec

1.process是一个全局进程,你可以直接通过process变量直接访问它. process实现了EventEmitter接口,exit方法会在当进程退出的时候执行.因为进程退出之后将不再执行事件循环,所有只有那些没有回调函数的代码才会被执行. 在下面例子中,setTimeout里面的语句是没有办法执行到的. 1 process.on('exit', function () { 2 setTimeout(function () { 3 console.log('This will not ru

nodejs 修改端口号 process.env.PORT(window环境下)

各个环境下,nodejs设置process.env.PORT的值的命令,如下1.linux环境下: PORT=1234 node app.js 使用上面命令每次都需要重新设置,如果想设置一次永久生效,使用下面的命令. export PORT=1234 node app.js 2.windows下面按照顺序这样进行: set PORT=1234 node app.js window环境下,nodejs启动配置文件,基于package.json文件 { "name": "blog

解读setTimeout,promise.then,process.nextTick,setImmediate的执行顺序

最近在看<Node.js调试指南>的时候遇到有意思的几道题,是关于setTimeout, promise.then, process.nextTick, setImmediate的执行顺序.今天抽空记录下这道题的分析过程及背后的原理与知识点. 题目如下: // 题目一: setTimeout(()=>{ console.log('setTimeout') },0) setImmediate(()=>{ console.log('setImmediate') }) // 题目二: c

nodejs入门 多人聊天视频

Node.js 是运行在服务端的 JavaScript,如果你熟悉Javascript,那么你将会很容易的学会Node.js. 下边是nodejs的安装和多人聊天系统, windows环境下 1.安装nodejs nodejs的官网 https://nodejs.org/en/ 下载nodejs最新版本一步步安装就好. 没有什么可说的. 2.安装完成以后查看当前nodejs的版本和测试nodejs时候成功 查看nodejs版本. cmd命令行窗口 ---> node -v 测试nodejs 是否

nodejs学习资料

NodeJS基础 什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情.例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了document之类的内置对象.而运行在NodeJS中的JS的用途是操作磁盘文件或搭建HTTP服务器,NodeJS