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 ...
随机推荐
- 设计模式(java的23种设计模式)
转自:leshui http://blog.csdn.net/leshui/article/details/11951 在java版看见了这篇文章,作者以轻松的语言比喻了java的32种模式,有很好的 ...
- 认识Web前端、Web后端、桌面app和移动app新开发模式 - 基于Node.js环境和VS Code工具
认识Web.桌面和移动app新开发模式 - 基于Node.js环境和VS Code工具 一.开发环境的搭建(基于win10) 1.安装node.js和npm 到node.js官网下载安装包(包含npm ...
- CircRNA 环化RNA
2016国自然新秀CircRNA的研究策略和分析
- [GO]空接口
package main import "fmt" //空接口的实际意义就在于在使用函数时,空接口可以接收任意类型的值,类似于python中的*args, **kwargs fun ...
- libevent学习
libevent是一个开源的事件控制机制,如果不想陷入多进程或多线程的困扰,那么libevent将是很合适的工具. libevent提供了很多的API来管理和控制事件,可用于设计读.写.信号.定时等各 ...
- HDU 6162 Ch’s gift (线段树+树链剖分)
题意:给定上一棵树,每个树的结点有一个权值,有 m 个询问,每次询问 s, t , a, b,问你从 s 到 t 这条路上,权值在 a 和 b 之间的和.(闭区间). 析:很明显的树链剖分,但是要用 ...
- [可行]setoolkit生成木马软件远程控制实例
查看原文 选1,social-ensineering attacks 选4,create a payload and listener 选2,Windows Reverse_TCP Meterpret ...
- CGLIB介绍与原理(通过继承的动态代理)
一.什么是CGLIB? CGLIB是一个功能强大,高性能的代码生成包.它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充.通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接 ...
- [Erlang06]在Erlang shell怎么在目录A下编译目录B下的文件,并把生成文件统一放置目录C?
问题描述: 我们想快速测试一个小功能,第一个反应就是打开Erl shell 直接输入,但是当想测试一个复杂的函数时,一般会写成一个*.erl文件,然后在shell下: cd(FileDir). c(F ...
- 微信开发之c#下缓存jssdk的access_token
因为access_token的寿命只有7200秒,每日获取access_token存在上限,所以在获取access_token后,需要将其缓存起来. 首先建立一个模型 public class Acc ...