// 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的更多相关文章

  1. nodejs child process

    //Create child processvar thread = require('child_process'); var msg = thread.fork(__dirname + '/chi ...

  2. 实现nodejs的promises库(基于promise.js改写)

    原promise.js库地址:https://github.com/stackp/promisejs promises是JavaScript实现优雅编程的一个非常不错的轻量级框架.该框架可以让你从杂乱 ...

  3. NodeJs中process.cwd()与__dirname的区别

    process.cwd() 是当前执行node命令时候的文件夹地址 ——工作目录,保证了文件在不同的目录下执行时,路径始终不变__dirname 是被执行的js 文件的地址 ——文件所在目录 Node ...

  4. nodejs之process进程

    虽然node对操作系统做了很多抽象的工作,但是你还是可以直接和他交互,比如和系统中已经存在的进程进行交互,创建工作子进程.node是一个用于事件循环的线程,但是你可以在这个事件循环之外创建其他的进程( ...

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

    var cmd=process.platform=='win32'?'tasklist':'ps aux'; var exec = require('child_process').exec; var ...

  6. nodejs中function*、yield和Promise的示例

    var co = require("co"); var fs = require("fs"); function cusReadFile(fileName) { ...

  7. NodeJS API Process全局对象

    Process 全局对象,可以在代码中的任何位置访问此对象,使用process对象可以截获进程的异常.退出等事件,也可以获取进程的当前目录.环境变量.内存占用等信息,还可以执行进程退出.工作目录切换等 ...

  8. nodejs(一)process模块

    1.process是一个全局进程,你可以直接通过process变量直接访问它. process实现了EventEmitter接口,exit方法会在当进程退出的时候执行.因为进程退出之后将不再执行事件循 ...

  9. 解决"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. Windows7 64位 安装mysql

    Windows上安装MySQL还是比较方便的,之前做过一个Windows10上面的安装方法,但是一个同学说自己的电脑是Windows7的,所以我写一个Windows7上的MySQL安装方法. MySQ ...

  2. hdu Lovekey(水题)

    #include<stdio.h> #include<string.h> ]; int main() { ],s2[]; int l1,l2,i,j,k; while(scan ...

  3. [C#] IEnumerable vs IQueryable

    这篇博客将介绍IEnumerable和IQueryable之间的区别. 1. IQueryable是继承自IEnumerable接口的.所以IEnumerable能做的,IQueryable都能做. ...

  4. YII2 rule exist unique

    ['mobile', 'exist', 'targetClass' => 'xmobile\modules\v1\models\BuyerList', 'message' => '当前用户 ...

  5. linux常用Java程序员使用命令(一)

    pwd 显示当前路径cd 切换目录 . .. ~ls 显示文件(夹) -l 显示详细信息 -a 显示全部,包括隐藏文件(夹) mkdir 创建文件夹 -p 递归创建 touch 创建空白文件 echo ...

  6. 42 :809*x=800*x+9*x+1

    题目:809*x=800*x+9*x+1(去掉最后的1有解)其中x代表的两位数,8*x的结果为两位数,9*x的结果为3位数.求x代表的两位数,及809*x后的结果(两种方法实现) public cla ...

  7. 一款基于uploadify扩展的多文件上传插件,完全适用于Html5

    http://www.uploadify.com/documentation/  官网里面有两个插件,一个是要使用flash插件才能文件上传的插件,另外一个是不需要使用要flash插件的文件上传插件完 ...

  8. C#调用windows命令行(CMD)

    using System.Diagnostics; public static void StartCmd(String command){Process p = new Process();p.St ...

  9. 洛谷P4172 [WC2006]水管局长(lct求动态最小生成树)

    SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水管的路径, ...

  10. Java知多少虚拟机(JVM)以及跨平台原理

    相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就 ...