参考:什么是协程
协程
实际上是很早就提出的概念,但在本世纪才被广泛使用。
线程的调度是内核级的,协程的切换是由程序控制的,大大减少了开销。
基本流程:
- 协程A开始执行
- 协程A执行完第一段,协程A暂停,将执行权转移给协程B
- 协程B交还执行权
- 协程A继续执行
例:
function* asyncJob() {
// asyncJob的前半部分代码执行
var b = yield readFile(FileB)
// asyncJob的后半部分代码执行
}
以上的asyncJob函数就是一个协程,协程执行到yield时会把执行权交出去,暂停自己,等执行权交还后再继续执行。
Generator
用Generator实现协程:
function* gen(x) {
let y = 0
try{
y = yield x * 2 + 1
}
catch (e) {
console.log(e)
}
return y
}
let g = gen(1)
console.log(g.next()) // { value: 3, done: false }
console.log(g.next(100)) // { value: 100, done: true }
g.throw('出大问题') // 出大问题
第一个next是返回出了计算后y的值(确切来说是第一个yield的返回值),第二个next是传入了一个值,这个值作为上一个异步任务的结果给了yield,然后这一步又返回了y。
ps: 本次next传的参数只能赋给上一次已经执行的yield,yield接收到传递的参数后可以进行下一步计算然后赋值给左边。
这里特别更正一下,yield可以发出数据 也可以接收数据。