Skip to content

异步编程思想的演进:从 Rx 到 Kotlin Coroutines

在前端乃至全栈开发的领域中,异步编程始终是一个绕不开的话题。 无论是 JavaScript 的 Promise / async-await,还是 Android / Kotlin 世界里的 Future、RxJava、Coroutines,本质上都在解决同一个问题:如何让线程调度更优雅,让异步逻辑更可控。

作为大前端开发者,我们常说,理解异步机制的思想,比熟悉具体框架更重要。 因为不同的异步框架,往往只是不同哲学的落地实现。


一、从 Future 到 Rx:两种异步哲学

在最初的阶段,Java 世界里常见的异步模型是 Future。 它代表“一次性的异步结果”——当任务完成后,你可以获取结果,但整个过程仍是单线程的思维方式,调用者必须等待任务完成或通过回调处理结果。

Future 模型强调的是任务本身的生命周期,是一种命令式的异步逻辑。 它更接近“我要启动一个任务,然后在某个时刻拿到结果”。

而到了 Rx(Reactive Extensions)时代,异步编程被重新定义为数据流的响应式处理。 在 Rx 中,数据是一条持续变化的流(Stream),而不是一次性的结果。 我们不再关心任务何时完成,而是订阅(subscribe)事件流的变化,以函数式的方式组合、过滤、变换数据。

这种模式的核心思想是:

「用声明式的方式描述数据变化,而不是命令式地等待结果。」

从这个角度看,Rx 更像是一种“多线程思维”,它让异步逻辑天然并行、天然响应。


二、Kotlin Coroutines:在 Future 与 Rx 之间的“桥梁”

随着 Kotlin 的普及,Google 推出了官方异步框架 —— Kotlin Coroutines。 它既不是单纯的 Future,也不是完全的 Rx。 它在设计上同时参考了这两种思想:

  • 继承了 Future 的“任务体阻塞”模型,让异步代码看起来像同步一样;
  • 借鉴了 Rx 的“状态流”思维,通过 Flow 实现数据流式的响应。

从使用者的角度来看,Coroutines 的体验是非常友好的。 你可以用 suspend 让代码像同步那样书写,却在底层以非阻塞方式调度线程; 也可以用 Flow 实现响应式数据流,而无需引入复杂的 Rx 操作符。

因此,很多人称它为:

“从 1 到无穷的框架” —— 既能处理单次异步任务,也能优雅地处理持续流动的数据。


三、要不要学习 Kotlin Coroutines?

很多开发者都会有这个疑问。 其实,不学习 Kotlin Coroutines 也完全没问题。 只要掌握 RxJava,你几乎能实现一切异步需求:数据流、线程切换、错误捕获、背压处理…… Rx 的技术广度是足够的。

但从生态的角度看,Kotlin Coroutines 已经成为 Android 及 Kotlin 官方标准。 它与 Jetpack、Compose、Room、Retrofit 等库深度集成,几乎是 Kotlin 世界的“默认异步语言”。 因此,如果你希望在现代 Kotlin 生态中继续深入,Coroutines 依然值得投入学习。


四、“技术卷”的现象与心态

有些团队和开发者,看着别人都在学 Coroutines,自己不学就觉得落后。 于是就“卷”了起来。

其实,这种“技术焦虑”很常见,也不完全是坏事。 在卷的过程中,你可能会接触到新的编程范式,理解框架背后的设计哲学。 但更重要的是,不要为学框架而学框架。 真正该卷的,是底层思想:异步的调度模型、线程的设计哲学、异常的传播逻辑。


五、从异常机制看思想差异

在 RxJava 中,错误是通过流的 onError() 传递的。 异常并不会真正抛出,而是以一种“事件”的形式在流中传播。 这符合它“数据流一切皆事件”的哲学。

而在 Coroutines 中,异常回到了传统的 try/catch 模型。 它更直观,但也意味着你需要改变思维方式。 同时,在单元测试中,你需要调整测试的调度器与执行环境,比如使用 runTestTestCoroutineDispatcher

这种差异看似只是语法层面的不同, 实则是编程哲学的不同

  • Rx 强调流的连续性;
  • Coroutines 强调结构化的并发。

六、结语:思想比框架更重要

学习异步编程,不是为了追新框架,而是为了理解并发与响应式思维的本质。 当你真正理解 Rx 与 Coroutines 背后的设计逻辑后,你会发现:

它们解决的,其实都是“时间”这个维度上的问题—— 如何让代码与时间的关系更自然、更安全、更可控。

Rx 教会你以流的角度思考变化, Coroutines 教会你以结构化的方式掌控异步。 掌握了这两种思想,无论你在前端、后端还是跨端,都能写出更加优雅、健壮的异步代码。

随便写写的,喜欢就好。 使用VitePress构建