es6中的Generator函数
文章类型:ES6
发布者:hp
发布时间:2023-04-21
一:是什么
1:Generator函数可以说是Iterator接口的具体实现方式,本身具有暂停和恢复执行的特性
2:会返回一个遍历器对象,每一次Generator函数里面的yield都相当一次遍历器对象的next()方法,并且可以通过next(value)方法传入自定义的value,来改变Generator函数的行为。
3:Generator函数可以通过配合Thunk 函数更轻松更优雅的实现异步编程和控制流管理
4:可以被暂停和恢复执行,并且可以用于生成一个可迭代的序列。使用一个新的关键字"function*"来定义
二:代码
1:
// 使用 * 表示这是一个 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 }
2:接收参数,这些参数可以在每次调用next()方法时传递进来
function* myGenerator() {
const name = yield "What's your name?";
const age = yield "How old are you?";
yield `Hello ${name}, you are ${age} years old`;
}
const generator = myGenerator();
console.log(generator.next()); // { value: "What's your name?", done: false }
console.log(generator.next("John")); // { value: "How old are you?", done: false }
console.log(generator.next(25)); // { value: "Hello John, you are 25 years old", done: false }
console.log(generator.next()); // { value: undefined, done: true }
3:使用yield*语句来委托执行另一个Generator函数
function* subGenerator() {
yield "Hello";
yield "World";
}
function* myGenerator() {
yield* subGenerator();
yield "!";
}
const generator = myGenerator();
console.log(generator.next()); // { value: "Hello", done: false }
console.log(generator.next()); // { value: "World", done: false }
console.log(generator.next()); // { value: "!", done: false }
console.log(generator.next()); // { value: undefined, done: true }
4:通过throw()方法在函数内部抛出一个异常,
function* myGenerator() {
try {
const name = yield "What's your name?";
const age = yield "How old are you?";
yield `Hello ${name}, you are ${age} years old`;
} catch (err) {
console.log(err);
}
}
const generator = myGenerator();
console.log(generator.next()); // { value: "What's your name?", done: false }
console.log(generator.next("John")); // { value: "How old are you?", done: false }
console.log(generator.throw(new Error("Invalid age"))); // Error: Invalid age
5:可以使用return()方法在函数内部返回一个值,并结束函数执行
function* myGenerator() {
const name = yield "What's your name?";
const age = yield "How old are you?";
yield `Hello ${name}, you are ${age} years old`;
}
const generator = myGenerator();
console.log(generator.next()); // { value: "What's your name?", done: false }
console.log(generator.next("John")); // { value: "How old are you?", done: false }
console.log(generator.return()); // { value: undefined, done: true }
三:作用
1:可以用来异步编程,可以在异步操作完成后恢复执行。使用Generator函数可以避免回调地狱和Promise的嵌套,使代码更加清晰易读
四:总结
1:状态和执行顺序可以被外部控制。
2:可以使用yield*语句调用其他Generator函数或可迭代对象。
3:可以使用yield语句接收外部输入和返回内部状态。
4:可以与Promise、async/await等技术一起使用,以实现更加灵活和高效的异步操作。