# 协程

协程(coroutine)是一种异步编程解决方案。意思是多个线程互相协作,完成异步任务。

协程的运行流程大致如下:

  • 第一步,协程 A 开始执行。
  • 第二步,协程 A 执行到一半,进入暂停,执行权转移到协程 B。
  • 第三步,(一段时间后)协程 B 交还执行权。
  • 第四步,协程 A 恢复执行。
    上面流程的协程 A,就是异步任务,因为它分成两段(或多段)执行。这可以类比到平时的网络请求。

Generator 就是一种在 ES6 的协程实现。它内部有 yield 关键字可以交出函数的执行权,等到需要执行时再执行。

# 异步应用

因为 generator 可以暂停执行和继续执行,所以它很适合封装异步任务。
假如有三次 api 请求,每一次都依赖上一次返回的结果,就可以用 yield 暂停执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
function* asyncTaskGenerator() {
try {
const result1 = yield mockRequest('https://api1.com');
console.log(result1);
const result2 = yield mockRequest('https://api2.com');
console.log(result2);
const result3 = yield mockRequest('https://api3.com');
console.log(result3);
return [result1, result2, result3];
} catch (error) {
console.error('Error:', error);
}
}

# 自动流程管理

但是这段代码不能做到自动流程管理,倘若有非常多个 api 请求写的代码就比较冗余。所以你可以使用 Thunk 函数或 Co 模块进行自动流程管理。

# async/await 的出现

async/await 的出现是为了简化 Promise 的使用,其实它们是 Generator 的语法糖。
你可以看作将 * 改为 async,将 yield 改为 await。它的改进如下:

  • 内置执行器
  • await 可以接受更多的类型比如原始类型值
  • 返回值是 Promise 而不是 Iterator
更新于

请我喝[茶]~( ̄▽ ̄)~*

imtangx 微信支付

微信支付

imtangx 支付宝

支付宝

imtangx 贝宝

贝宝