第21天 Generator 原理

本文介绍了Generator在ES6中的异步编程应用,通过实例展示了如何使用*运算符定义Generator函数,以及其yield关键字如何控制代码执行流程。重点讲解了Generator函数的实现原理和编译后的效果,帮助读者理解Generator在处理异步操作中的优势。
摘要由CSDN通过智能技术生成

Generator 是 ES6 中新增的语法,和 Promise ⼀样,都可以⽤来异步编 程

// 使⽤ * 表示这是⼀个 Generator 函数
// 内部可以通过 yield 暂停代码
// 通过调⽤ next 恢复执⾏
function* test() {
 let a = 1 + 2;
 yield 2;
 yield 3; }
let b = test();
console.log(b.next()); // > { value: 2, done: false }
console.log(b.next()); // > { value: 3, done: false }
console.log(b.next()); // > { value: undefined, done: true }

从以上代码可以发现,加上 * 的函数执⾏后拥有了 next 函数,也就是说 函数执⾏后返回了⼀个对象。每次调⽤ next 函数可以继续执⾏被暂停的代 码。以下是 Generator 函数的简单实现

// cb 也就是编译过的 test 函数
function generator(cb) {
 return (function() {
	 var object = {
		 next: 0,
		 stop: function() {}
	 };
	 return {
	 	next: function() {
		 var ret = cb(object);
		 if (ret === undefined) return { value: undefined, done: true };
			return {
			 value: ret,
			 done: false
			 };
		 	}
		 };
	 })(); 
}
// 如果你使⽤ babel 编译后可以发现 test 函数变成了这样
function test() {
 var a;
 return generator(function(_context) {
 while (1) {
 switch ((_context.prev = _context.next)) {
 // 可以发现通过 yield 将代码分割成⼏块
 // 每次执⾏ next 函数就执⾏⼀块代码
	 // 并且表明下次需要执⾏哪块代码
	 case 0:
		 a = 1 + 2;
		 _context.next = 4;
	 return 2;
	 case 4:
		 _context.next = 6;
	 return 3;
	// 执⾏完毕
	 case 6:
	 case "end":
	 	return _context.stop();
	 	}
	 }
 }); 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值