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的更多相关文章
- nodejs child process
//Create child processvar thread = require('child_process'); var msg = thread.fork(__dirname + '/chi ...
- 实现nodejs的promises库(基于promise.js改写)
原promise.js库地址:https://github.com/stackp/promisejs promises是JavaScript实现优雅编程的一个非常不错的轻量级框架.该框架可以让你从杂乱 ...
- NodeJs中process.cwd()与__dirname的区别
process.cwd() 是当前执行node命令时候的文件夹地址 ——工作目录,保证了文件在不同的目录下执行时,路径始终不变__dirname 是被执行的js 文件的地址 ——文件所在目录 Node ...
- nodejs之process进程
虽然node对操作系统做了很多抽象的工作,但是你还是可以直接和他交互,比如和系统中已经存在的进程进行交互,创建工作子进程.node是一个用于事件循环的线程,但是你可以在这个事件循环之外创建其他的进程( ...
- nodejs的process模块如何获取其他进程的pid
var cmd=process.platform=='win32'?'tasklist':'ps aux'; var exec = require('child_process').exec; var ...
- nodejs中function*、yield和Promise的示例
var co = require("co"); var fs = require("fs"); function cusReadFile(fileName) { ...
- NodeJS API Process全局对象
Process 全局对象,可以在代码中的任何位置访问此对象,使用process对象可以截获进程的异常.退出等事件,也可以获取进程的当前目录.环境变量.内存占用等信息,还可以执行进程退出.工作目录切换等 ...
- nodejs(一)process模块
1.process是一个全局进程,你可以直接通过process变量直接访问它. process实现了EventEmitter接口,exit方法会在当进程退出的时候执行.因为进程退出之后将不再执行事件循 ...
- 解决"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; ch ...
随机推荐
- 1、设备网络SDK主要功能
图像预览.文件回放和下载,云台控制,布防/撤防,语音对讲,日志管理,解码卡,远程升级,远程重启/关闭,格式化硬盘,参数配置(系统配置,通道配置,串口配置,报警配置,用户配置),多路解码器,智能设备功能 ...
- LWIP带UCOS操作系统移植
LWIP支持RAW.NETCONN.SOCKET这三种编程接口,后两者必须有操作系统来支持的:LWIP带操作系统的移植很重要!!
- Perl 学习笔记-子程序
1.定义子程序 使用sub关键字定义 ; 子程序名和标识符同要求, 但是有的特殊的可以用 &符号; 子程序是全局的, 不需要再使用前声明; 重名函数后者覆盖前者. sub roger{ ...
- https hsts 私密链接
chrome强制转跳https,删除对某个域名的强制转跳即可 hrome的地址栏输入:chrome://net-internals/#hsts 在Delete domain下输入相对应的网址,不带 ...
- UVALive 7749 Convex Contour (计算几何)
题意:给定上正方形,圆,三角形,让你求出包围它的最短的路径. 析:首先,如果是这种情况 三角形 三角形 三角形 正方形(圆) 三角形 三角形 三角形 ..这一种就是直接从左边直接连到正方形(圆),也 ...
- 编写高质量代码改善C#程序的157个建议——建议125:避免用FCL的类型名称命名自己的类型
建议125:避免用FCL的类型名称命名自己的类型 试想过自己写一个Socket类型吗?如果没有,我们来尝试一下: public class Socket { //省略 } 把以上代码同某些其他工具类封 ...
- js阿拉伯数字转中文大写 方法重多
方法一 function DX(n) { if (!/^(0|[1-9]\d*)(\.\d+)?$/.test(n)) return "数据非法"; var unit = &qu ...
- c语言和java以及安卓和苹果
苹果手机是本地,没有中间环节,速度快,基于Linux系统 安卓是通过虚拟机,影响速度 就像c语言和java c适用于架构小的地方,因为直接编译运行 而java用于架构比较大的地方,启动慢,启动之后效率 ...
- Mac OS X Yosemite & Arduino安装CH340 USB转串口驱动
新买的Arduino开发板 USB转串口使用了CH340芯片,在Mac OS X Yosemite上正常安装驱动后,在Arduino IDE的端口没发现相应的设备,使用以下方法后就能使用USB转串口调 ...
- 模仿w3c school的示例导航栏
近日学习HTML,恰巧学习过程中看见w3cschool的示例导航栏看上去很不错,适合新手练习,于是模仿着做了一个. 示例导航栏如下图所示 导航栏自然使用li标签来做,a标签控制背景颜色和鼠标放入的特效 ...