Nodejs (5) 异步编程

Submitted by Lizhe on Fri, 01/05/2018 - 14:53

服务端异步编程的核心思想在于: 事件发生会触发响应逻辑. 在Node的世界里流行两种响应逻辑管理方式: 

回调和事件监听

回调通常用来定义一次性响应的逻辑

事件监听器 本质上也是一个回调, 不同的是它跟一个事件相关联. 

var http = require('http');
http.createServer(
    function(req,res){
        res.writeHead(200,{'Content-type':'text/plain'});
        res.end('helloworld\n');
    }
).listen(3000);

回调是一个函数, 它被当做参数传给异步函数, 它描述了异步操作完成之后要做什么.

上面例子中的创建了一个HTTP服务器,并用回调定义响应逻辑

20180105

回调层数越多, 代码看起来越乱, 重构和测试起来也更困难, 可以把每一层回调嵌套的处理做成命名函数

例如修改成下面这种形式

var http = require('http');
http.createServer(
    function(req,res){
        sayHello(req,res);
    }
).listen(3000);

var sayHello = function(req,res){
    res.writeHead(200,{'Content-type':'text/plain'});
    res.end('helloworld\n');
}

 

你还可以通过Node开发中的另一种惯用法来减少由if/else引起的嵌套: 尽早从函数中返回
 

 

用事件发射器处理重复性事件

事件发射器会触发事件, 并且在那些事件被触发时能处理它们. 一些重要的Node API 组件比如 HTTP 服务器, TCP服务器和流, 都被做成了事件发射器. 

你也可以创建自己的事件发射器

下面是Node中的TCP socket, 它有一个data事件, 每当socket中有新数据时就会触发

socket.on('data',handleData);

var net = require('net');
net.createServer(
    function(socket){
        echo(socket);
    }
).listen(3000);

var echo = function(socket){
    socket.on('data',function(data){
        socket.write(data);
    });
}

201801050443