随着Web2.0的带来,JavaScript在前端担任了更多职责,事件也得到了广泛应用。Node不像Rhino那样受Java影响很大,而是将前端浏览器中应用广泛的成熟的事件引入后端,配合异步 I/O, 将事件点暴露给业务逻辑。
下面的例子是Ajax异步提交的服务器端处理过程。Node创建一个Web服务器,并侦听 8080 端口。对于服务器,我们为其绑定了 request 事件,对于请求对象,我们为其绑定了 data 事件和 end 事件:
~~~
const http=require('http');
const querystring = require('querystring');
// 侦听服务器的request事件
http.createServer((req, res)=>{
var postData='';
req.setEncoding('utf-8');
// 侦听请求的data事件
req.on('data', (trunk)=>{
postData += trunk;
});
// 侦听请求的 end 事件
req.on('end',()=>{
res.end(postData);
})
}).listen(8080);
console.log('服务器启动完成');
~~~
相应地,我们在前段为Ajax请求绑定了 success 事件,在发出请求后,只需关心请求成功时执行相应的业务逻辑即可,相关代码如下:
~~~
$.ajax({
'url':'/url',
'method':'POST',
'data':{},
'success':function(data){
//success 事件
}
});
~~~
相比之下,无论在前端还是后端,事件都是常用的。对于其它语言来说,这种JavaScript的熟悉感是基本不会出现的。
事件的编程方式具有轻量级、松耦合、只关注事务点等优势,但是在多个异步任务场景下,事件与事件之间各自独立,如何协作是一个问题。
从前面可以看到,回调函数无处不在。这是因为在JavaScript中,我们将函数作为一等公民,可以将函数作为对象传递给方法作为实参进行调用。
与其它的Web后端编程语言相比,Node除了异步和事件外,回调函数是一大特色。纵观下来,回调函数也是也是最好的接受异步调用返回数据的方式。但这种编程方式对于很多习惯同步思路编程的人来说,也许是十分不习惯的。代码的编写顺序与执行顺序并无关系,这对他们可能造成阅读上的障碍。在流程控制方面,因为穿插了异步方法和回调函数,与常规的同步方式相比,变得不那么一目了然了。
在转变为异步编程思维后,通过对业务的划分和对事件的提炼,在流程控制方面处理业务的复杂度与同步方式实际上是一致的。
关于流程控制和事件协作的方法和技巧,我们将在第4章中进一步探讨。
- 目录
- 第1章 Node 简介
- 1.1 Node 的诞生历程
- 1.2 Node 的命名与起源
- 1.2.1 为什么是 JavaScript
- 1.2.2 为什么叫 Node
- 1.3 Node给JavaScript带来的意义
- 1.4 Node 的特点
- 1.4.1 异步 I/O
- 1.4.2 事件与回调函数
- 1.4.3 单线程
- 1.4.4 跨平台
- 1.5 Node 的应用场景
- 1.5.1 I/O 密集型
- 1.5.2 是否不擅长CPU密集型业务
- 1.5.3 与遗留系统和平共处
- 1.5.4 分布式应用
- 1.6 Node 的使用者
- 1.7 参考资源
- 第2章 模块机制
- 2.1 CommonJS 规范
- 2.1.1 CommonJS 的出发点
- 2.1.2 CommonJS 的模块规范
- 2.2 Node 的模块实现
- 2.2.1 优先从缓存加载
- 2.2.2 路径分析和文件定位
- 2.2.3 模块编译
- 2.3 核心模块
- 2.3.1 JavaScript核心模块的编译过程
- 2.3.2 C/C++核心模块的编译过程
- 2.3.3 核心模块的引入流程
- 2.3.4 编写核心模块
- 2.4 C/C++扩展模块
- 2.4.1 前提条件
- 2.4.2 C/C++扩展模块的编写
- 2.4.3 C/C++扩展模块的编译
- 2.4.2 C/C++扩展模块的加载
- 2.5 模块调用栈
- 2.6 包与NPM
- 2.6.1 包结构
- 2.6.2 包描述文件与NPM
- 2.6.3 NPM常用功能
- 2.6.4 局域NPM
- 2.6.5 NPM潜在问题
- 2.7 前后端共用模块
- 2.7.1 模块的侧重点
- 2.7.2 AMD规范
- 2.7.3 CMD规范
- 2.7.4 兼容多种模块规范
- 2.8 总结
- 2.9 参考资源
- 第3章 异步I/O
- 3.1 为什么要异步I/O
- 3.1.1 用户体验
- 3.1.2 资源分配
- 3.2 异步I/O实现现状
- 3.2.1 异步I/O与非阻塞I/O
- 3.2.2 理想的非阻塞异步I/O
- 3.2.3 现实的异步I/O
- 3.3 Node的异步I/O
- 3.3.1 事件循环
- 3.3.2 观察者
- 3.3.3 请求对象
- 3.3.4 执行回调
- 3.3.5 小结
- 3.4 非I/O的异步API
- 3.4.1 定时器
- 3.5 事件驱动与高性能服务器