第五章|异步与事件循环
本章沿“工作何时发生 → 结果如何传播 → 多项工作如何合作”的顺序学习。先明确回调与异常的时间边界,再理解任务、微任务和 Promise,最后处理取消、竞态与有限资源。
- 回调与异步错误:识别同步回调,理解计时器和异常边界。
- 事件循环与 Promise:逐步推导调度与链式传播。
- async、并发组合与取消:安排依赖,保护取消与最新结果。
- 有界并发与调度:限制启动、理解背压、重试与宿主差异。
完成后应能解释每一个 await 等待什么、每一个失败由谁接住、每一个已启动操作由谁负责结束。所有例子聚焦知识机制;项目实战在独立板块。
先准备同步执行的底图
阅读前需要理解函数调用栈、return、throw 与 try/catch。同步代码中的调用方还在栈上,才能接住被调用函数的异常;计时器回调开始时,原调用方已经返回。异步错误传播之所以需要额外协议,正是这个时间差造成的。
Promise 把跨越这个间隙的结果变成一个可传递对象,then 建立下一段依赖;async/await 让同样的依赖更接近顺序代码。三种写法不是三套互不相关的机制,可以用“谁安排下一段、下一段接收什么、失败交给谁”统一阅读。
Promise 部分要同时追踪“哪个对象的状态”和“哪个函数的返回”。执行器的返回值、thenable方法的返回值、then处理器的返回值并不遵循同一种规则。正文用可控resolve与日志逐步分离它们,避免把所有Promise相关函数都理解为return就成功。
进入取消前,再确认三条时间线:调用方何时停止等待、底层操作何时停止、清理何时完成。超时与有界并发的难点常在三条时间线不同步,而不是语法写不出来。本章既演示提前报告失败,也说明它不能自动代替收尾。
顺序正确之后再讨论速度
先画出必须等待的依赖,再决定哪些操作可以同时启动。缺少依赖就可能读到尚未完成的数据;加入多余依赖则让独立等待排成长龙。并发组合解决结果收集,取消解决工作寿命,版本检查解决结果归属,这三件事彼此补充。
最后一篇才加入有限资源:操作虽然独立,宿主连接和内存并不无限。有限并发限制同时启动数量,背压进一步让生产者知道消费者处理不过来。下一章会沿这个问题进入异步迭代,而不是突然另起一套数据流术语。
读完以后动手检查
读完后,应能把一次读取的成功与三种失败接到同一返回结果,为两个独立使用者各自保护最新提交,并选择遇错停止或逐项收集的并发策略。各篇第四题提供可控输入与失败条件;先证明结果归属和停止承诺,再比较运行速度。