##异步I/O

I/O 输入与输出

回调方法

return返回(传统)

image.png

callback返回

结果作为参数传递给callback
image.png

同步读文件

程序发起I/O请求后,将一直等待I/O的结果响应,这期间不会执行下行逻辑
image.pngimage.png

异步读文件

程序发起I/O请求后,并没有等待I/O的请求结果,直接执行下行逻辑,等到操作系统I/O结果返回给我们时,NodeJs会自动调用原先设置的回调方法
image.pngimage.png
异步读取文件返回的时机取决读取文件的大小,系统的调度。 文件小,调度快,返回就先。跟调用的顺序无关。

##事件循环模型

处理事件的逻辑称为事件循环

事件循环流程图

image.pngimage.png
循环是活动的:若还有任务没有完成,如文件读取,但是未收到结果,开启web服务没有关闭
总结新事件产生后会插在队尾加入队列,按照先进先出的顺序逐个执行事件绑定的回调方法事件。队列每次只会执行一个事件,一个事件的代码逻辑没有执行完是不会开始下一个的

##事件驱动模型与高性能服务器

image.pngimage.png

Node.js服务器特点

  • 高并发连接(单线程+事件驱动模型)
  • 适合I/0密集型任务(采用异步I/O+事件驱动模型)
  • 不适合CPU密集型计算服务

image.pngimage.png

练习

image.png
image.png

##异步编程问题

异步捕获

在同步编程中使用try{ }catch{ }捕获业务抛出的error
在异步编程中,如果产生异常的时间是在异步完成的阶段,此时抛出的异常无法通过try{ }catch{ }捕获,因为异步I/O是不会等待I/O结果的

约定

NodeJs中对于插入回调函数的异步函数API,将回调函数中的第一个参数用来返回是否有err,如果有就是err,没有就是null,保证程序的健壮性
image.pngimage.png

发布订阅模式

在异步编程中充斥着大量的回调处理方法,如果不好好处理代码逻辑,最终会导致整个代码混乱,在NodeJ中将回调方法进行事件化处理。

  • 发布/订阅模式,定义对象间的一种一对多的关系,一个发布者可以对应多个订阅者。
  • 发布者负责触发(发布)事件,订阅者在监听(订阅)事件之后,当事件触发,则执行响应的回调方法。
  • 注册之后可以进行移除,移除表示不再订阅这个事件了,当事件触发,不会再通知订阅者。

    Promise

    回调地狱
    image.png

    回调方法改写promise

    image.pngimage.png
    image.pngimage.png

    async/await

    串行
    image.png
    并行
    image.png