// main.js

  1. const cp = require('child_process');
  2. const child = cp.fork('./child.js');
  3.  
  4. const callbackPool = {};
  5.  
  6. child.on('message', msg => {
  7. let msgId = msg._id,
  8. cb = callbackPool[msgId];
  9.  
  10. if (cb) {
  11. cb.resolve(msg);
  12. clearTimeout(cb.timer);
  13. callbackPool[msgId] = null;
  14. }
  15. });
  16.  
  17. Promise.all([
  18. sendMessage({timeout: 1e3}),
  19. sendMessage({timeout: 2e3}),
  20. sendMessage({timeout: 2e3}),
  21. sendMessage({timeout: 1e3}),
  22. ]).then(rv => {
  23. log(rv);
  24. }).catch(err => {
  25. log(err);
  26. })
  27.  
  28. function sendMessage(msg, cb) {
  29. msg._id = (Math.random() * 1e6) | 0;
  30. child.send(msg);
  31. log('sent', msg);
  32. return new Promise((resolve, reject) => {
  33. let msgId = msg._id,
  34. timer = setTimeout(function() {
  35. let cb = callbackPool[msgId];
  36. if (cb) {
  37. clearTimeout(cb.timer);
  38. callbackPool[msgId] = null;
  39. }
  40. reject('timeout');
  41. }, 5e3);
  42. callbackPool[msgId] = { resolve, reject, timer };
  43. });
  44. }
  45.  
  46. function log(...args) {
  47. args.unshift(new Date().toLocaleString());
  48. console.log.apply(console, args);
  49. }

// child.js

  1. process.on('message', msg => {
  2. doReply(msg);
  3. });
  4.  
  5. function doReply(msg){
  6. setTimeout(() => {
  7. msg.data = msg._id * 2;
  8. sendMessage(msg);
  9. }, (msg.timeout || 0) * 2);
  10. }
  11.  
  12. function sendMessage(msg){
  13. process.send(msg);
  14. }

  

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. 白盒测试实践-任务进度-Day03

    所使用静态代码检查工具 阿里巴巴Java开发代码检测IDE插件 小组成员 华同学.郭同学.覃同学.刘同学.穆同学.沈同学 任务进度 经过前期的学习和会议筹备,今天我们小组召开了代码评审会议.以下是今天 ...

  2. web测试——完结感言

    1.在小组所有成员一人找出了博客园的2个小bug. 2.杨瑞丰与李建文完成了用户调研和定量评价. 3.张颖与汪鸿也完成了产品分析和与CSDN的横向比较. 4.胡俊辉一个人总结所有人的问题与结果,进行了 ...

  3. HDU 1104 Remainder (BFS求最小步数 打印路径)

    题目链接 题意 : 给你N,K,M,N可以+,- ,*,% M,然后变为新的N,问你最少几次操作能使(原来的N+1)%K与(新的N)%k相等.并输出相应的操作. 思路 : 首先要注意题中给的%,是要将 ...

  4. Windows装python

    pycharm常用快捷键ctr+alt+shift+l可以快速格式化python安装下载地址https://www.python.org/downloads/release/python-365/ 一 ...

  5. 关于HTTP协议传输与接收数据的相关内容

    第一篇: HTTP请求报文和HTTP响应报文 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/28/2612910.html 第二篇: 深入浅出U ...

  6. zTree动态加载

    @{ Layout = null;} <!DOCTYPE html> <html><head> <meta name="viewport" ...

  7. WPF 实现INotifyPropertyChanged .Net Framework 4.5

    自己动手写了一个基类来实现INotifyPropertyChanged接口,以后可以直接使用. using System.ComponentModel; using System.Runtime.Co ...

  8. 8 个用于生产环境的 SQL 查询优化调整

    在没有数据仓库或单独的分析数据库的组织中,报告的唯一来源和最新的数据可能是在现场生产数据库中. 在查询生产数据库时,优化是关键.一个低效的查询可能会对生产数据库产生大量的资源消耗,如果查询有错误会引发 ...

  9. 「HNOI 2013」数列

    题目链接 戳我 \(Solution\) 这道题貌似并不难的样子\(QAQ\) 我们发现这个因为有首项的关系所以有点不太好弄.所以我们要将这个首项对答案的影响给去掉. 我们可以构建一个差分数组,我们令 ...

  10. python index()函数

    python内置index()函数 index() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,该方法与 python ...