JavaScript ES6 Generator/协程

参考:什么是协程

协程

实际上是很早就提出的概念,但在本世纪才被广泛使用。
线程的调度是内核级的,协程的切换是由程序控制的,大大减少了开销。
基本流程:

  1. 协程A开始执行
  2. 协程A执行完第一段,协程A暂停,将执行权转移给协程B
  3. 协程B交还执行权
  4. 协程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可以发出数据 也可以接收数据。

猜你喜欢

转载自blog.csdn.net/weixin_45543674/article/details/118661947