二. Node 编程基础 (未完)

2019-02-14  本文已影响0人  ddc大灰羊

本章主要讲的是
如何用模块组织代码;
异步编程的两种方式,回调和事件发射器;
异步逻辑的串行和并行控制方式;

1. 模块组织代码 module

module.exports = MyClass
//或者
module.exports = exports = MyClass

2. 回调

3. 事件监听器

  socket.on('data', handleData)

一个简单的聊天室例子

const event = require("events");
const net = require("net");
const channel = new event.EventEmitter();

channel.clients = {};
channel.subscription = {};
channel.on("join", function(id, client) {
  // 保存client连接
  this.clients[id] = client;
  // 定义每个client的subscription方法, 如果sender不是自己就发送message
  this.subscription[id] = (sender_id, message) => {
    if (id != sender_id) {
      this.clients[id].write(message);
    }
  };
  /*
  每次客户端join进来都会使用上面定义subscription方法来绑定到broadcast事件
  有n个client连进来,这个broadcast事件就被监听n次,发射时,也会触发n次回调函数
  */
  this.on("broadcast", this.subscription[id]);  //broadcast事件处理回调
});
channel.on("leave", function(id) {
  channel.removeListener("broadcast", this.subscription[id]);
  channel.emit("broadcast", id, `${id} has left the chatroom \n`);
});

const server = net.createServer(client => {
  const id = `${client.remoteAddress}:${client.remotePort}`;
  channel.emit("join", id, client);
  client.on("data", data => {
    data = data.toString();
    // 当接收到客户端发来的数据时,向channel发射broadcast事件
    channel.emit("broadcast", id, data);
  });

  client.on("close", () => {
    channel.emit("leave", id);
  });
});

server.listen(8888);

4. 串行和并行的流程控制

5. 流程控制工具

上一篇 下一篇

猜你喜欢

热点阅读