本文深入解析ES6引入的Generator数据类型,阐述其作为特殊函数的特性。通过function*定义,利用yield实现多次返回值及状态保存。详细演示next、return和throw方法的用法,包括done属性判断、提前终止迭代及异常处理机制,帮助开发者掌握异步编程与状态管理技巧。
Generator概述与定义
1. 概述
Generator是ES6规范中引入的一种新数据类型,其外观类似于普通函数,但具备独特行为。除了常规的return语句用于返回最终结果外,Generator还允许使用yield关键字多次返回值,从而实现暂停与恢复执行的能力。
在代码定义上,Generator函数必须使用function*语法进行声明,其中星号(*)是标识Generator的关键符号,不可省略。
Generator实例与迭代控制
2. 例子
普通函数在执行完毕后无法保留内部状态,若需在不同调用间保存数据(如计数器),通常不得不依赖全局变量,这容易引发命名冲突或状态污染。
2.1
'use strict';
function next_id(){
var id = 1;
while(id<100){
yield id;
id++;
}
return id;
}
// 测试:
var
x,
pass = true,
g = next_id();
for (x = 1; x < 100; x ++) {
if (g.next().value !== x) {
pass = false;
alert('测试失败!');
break;
}
}
if (pass) {
alert('测试通过!');
}
2.2 一个无限循环的迭代器
function* idMaker(){
var index = 0;
while(true)
yield index++;
}
var gen = idMaker(); // "Generator { }"
console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
2.3Generator.prototype.next()
当迭代过程正常结束时,调用Generator.next()方法返回的对象中,done属性值为true;而在迭代尚未结束之前,该属性值始终为false。
function* gen() {
yield 1;
yield 2;
yield 3;
}
var g = gen(); // "Generator { }"
g.next(); // "Object { value: 1, done: false }"
g.next(); // "Object { value: 2, done: false }"
g.next(); // "Object { value: 3, done: false }"
g.next(); // "Object { value: undefined, done: true }"
next与return方法详解
2.4 Generator.prototype.return();
return方法允许向迭代器传入一个给定的参数值,并立即终止迭代器的执行流程。
example
function* gen() {
yield 1;
yield 2;
yield 3;
}
var g = gen();
g.next(); // { value: 1, done: false }
g.return("foo"); // { value: "foo", done: true }
g.next(); // { value: undefined, done: true }
需要注意的是,如果迭代器已经处于done为true的结束状态,此时再调用return方法,其返回值中的value将变为undefined,尽管done仍为true。
function* gen() {yield 1;}
var g = gen();
console.log(g.next());//{ value: 1, done: false }
console.log(g.next());//{ value: undefined, done: true }
console.log(g.return(1)); //{ value: undefined, done: true }
throw方法与异常处理
2.5 Generator.prototype.throw()
throw()方法用于向Generator内部抛出一个异常,借此机制可以重新获取迭代器的执行权,常用于错误恢复或控制流跳转。
无论调用next、return还是throw,Generator相关方法最终都返回一个包含value和done两个属性的对象,用于描述当前迭代状态及返回值。
function* gen() {
while(true) {
try {
yield 42;
} catch(e) {
console.log("Error caught!");
}
}
}
var g = gen();
var a = g.next();
// { value: 42, done: false }
var b = g.throw(new Error("Something went wrong"));
// "Error caught!"
// { value: 42, done: false }
console.log(a);
console.log(b.value+"::"+b.done);
以上这篇深入理解js generator数据类型就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。