# 协程
协程(coroutine)是一种异步编程解决方案。意思是多个线程互相协作,完成异步任务。
协程的运行流程大致如下:
- 第一步,协程 A 开始执行。
- 第二步,协程 A 执行到一半,进入暂停,执行权转移到协程 B。
- 第三步,(一段时间后)协程 B 交还执行权。
- 第四步,协程 A 恢复执行。
上面流程的协程 A,就是异步任务,因为它分成两段(或多段)执行。这可以类比到平时的网络请求。
Generator 就是一种在 ES6 的协程实现。它内部有 yield 关键字可以交出函数的执行权,等到需要执行时再执行。
# 异步应用
因为 generator 可以暂停执行和继续执行,所以它很适合封装异步任务。
假如有三次 api 请求,每一次都依赖上一次返回的结果,就可以用 yield 暂停执行。
1 | function* asyncTaskGenerator() { |
# 自动流程管理
但是这段代码不能做到自动流程管理,倘若有非常多个 api 请求写的代码就比较冗余。所以你可以使用 Thunk 函数或 Co 模块进行自动流程管理。
# async/await 的出现
async/await 的出现是为了简化 Promise 的使用,其实它们是 Generator 的语法糖。
你可以看作将 * 改为 async,将 yield 改为 await。它的改进如下:
- 内置执行器
- await 可以接受更多的类型比如原始类型值
- 返回值是 Promise 而不是 Iterator