##异步I/O
回调方法
return返回(传统)
callback返回
结果作为参数传递给callback
同步读文件
程序发起I/O请求后,将一直等待I/O的结果响应,这期间不会执行下行逻辑
异步读文件
程序发起I/O请求后,并没有等待I/O的请求结果,直接执行下行逻辑,等到操作系统I/O结果返回给我们时,NodeJs会自动调用原先设置的回调方法
异步读取文件返回的时机取决读取文件的大小,系统的调度。 文件小,调度快,返回就先。跟调用的顺序无关。
##事件循环模型
事件循环流程图
循环是活动的:若还有任务没有完成,如文件读取,但是未收到结果,开启web服务没有关闭
总结新事件产生后会插在队尾加入队列,按照先进先出的顺序逐个执行事件绑定的回调方法事件。队列每次只会执行一个事件,一个事件的代码逻辑没有执行完是不会开始下一个的
##事件驱动模型与高性能服务器
Node.js服务器特点
- 高并发连接(单线程+事件驱动模型)
- 适合I/0密集型任务(采用异步I/O+事件驱动模型)
- 不适合CPU密集型计算服务
练习
##异步编程问题
异步捕获
在同步编程中使用try{ }catch{ }捕获业务抛出的error
在异步编程中,如果产生异常的时间是在异步完成的阶段,此时抛出的异常无法通过try{ }catch{ }捕获,因为异步I/O是不会等待I/O结果的
约定
NodeJs中对于插入回调函数的异步函数API,将回调函数中的第一个参数用来返回是否有err,如果有就是err,没有就是null,保证程序的健壮性
发布订阅模式
在异步编程中充斥着大量的回调处理方法,如果不好好处理代码逻辑,最终会导致整个代码混乱,在NodeJ中将回调方法进行事件化处理。