异步编程:从回调到响应式扩展的探索
1. 同步与异步计算
在函数没有副作用的情况下,时间成为了一个重要问题。步骤 1、2、3 的完成时间可能瞬间完成,也可能因工作性质而无法完成。关键在于如何确保这些步骤按正确顺序运行。常见的做法是将这些函数组合在一起,使一个函数的输出成为下一个函数的输入,形成步骤链。传统方法是嵌套一系列回调函数,应用程序的运行时模型类似如下流程:
graph LR
A[Step 1] -->|Calls step 2| B[Step 2]
B -->|Calls step 3| C[Step 3]
这种嵌套的控制流比同步的直线模型更难理解。在这个流程中,步骤 1 先运行,完成后调用步骤 2,接着步骤 3 执行,以此类推。这表明这些步骤之间存在时间依赖或时间耦合,即一个步骤在前一个步骤完成后立即开始,是一个命令链。回调函数用于响应之前的异步请求并开始处理其数据,常见于顺序 AJAX 请求,也会出现在其他基于事件的系统中,如按键、鼠标移动、数据库读写等,这些系统都依赖回调函数。
2. 回调函数是否过时?
答案是否定的。在处理与用户或外部服务的简单交互时,使用回调函数是合适的。例如,编写一个简单的脚本发出单个远程 HTTP 请求时,使用 RxJS 有些大材小用,回调函数仍是完美的解决方案。然而,当实现中等至高级复杂度的状态机,如动态 UI 或服务编排时,结合函数式和响应式范式的库就会发挥优势。比如,协调多个业务流程的执行,这些流程可能会使用多个微服务、进行数据混搭,或者实现由多个相互交互的小部件组成的丰富 UI 功能