生成器(Generator 函数)
约 786 字大约 3 分钟
2025-03-12
一、什么是生成器(Generator)?
Generator 是 JavaScript 中的一种特殊函数,它可以通过yield
语句暂停 和 恢复 函数的执行。生成器函数返回一个生成器对象,通过调用生成器对象的next()
方法可以逐步执行函数体,并在每次执行到yield
语句时暂停。该函数的执行可以在下一次调用next()
方法时继续,并返回yield
语句后面的值。
生成器函数为开发者提供了一种更灵活的方式来控制函数的执行流程。它们常用于异步编程和处理大量数据的情况下。通过生成器,我们可以按需生成和处理数据,避免一次性加载所有数据或在处理数据时阻塞执行。
二、如何处理异步操作?
生成器可以与Promise
一起使用来处理异步操作。可以使用yield
语句在生成器函数内部等待Promise
的结果,并使用.then()
方法恢复生成器的执行。下面是一个使用生成器处理异步操作的示例:
function* asyncTask() {
try {
const result = yield someAsyncFunction();
console.log(result);
} catch (error) {
console.error(error);
}
}
function someAsyncFunction() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("Async task completed.");
}, 2000);
});
}
const generator = asyncTask();
const promise = generator.next().value;
promise
.then((result) => {
generator.next(result);
})
.catch((error) => {
generator.throw(error);
});
在上面的示例中,asyncTask
是一个生成器函数,它使用yield
语句在someAsyncFunction
执行完成之后暂停执行,并将结果传递给console.log
。我们通过调用asyncTask
来创建一个生成器对象,并通过generator.next().value
获取生成器的第一个yield
语句返回的Promise
。然后,通过调用.then()
方法来恢复生成器的执行,并使用.next()
将结果传递给生成器。
三、Generator 函数与普通函数的区别。
Generator 函数是 ES6 引入的一种特殊函数类型,它可以产生一个可迭代的对象,该对象可以根据需要生成多个值。
Generator 函数和普通函数在语法上有一些区别。
Generator 函数使用
function*
关键字来定义,而不是普通函数的function
关键字。Generator 函数中使用 yield 语句来生成值,可以将 yield 理解为暂停函数执行并返回一个值。Generator 函数可以在后续调用 next()方法时继续执行,从上一个 yield 语句继续执行到下一个 yield 语句,或者执行完整个函数体。
普通函数在调用时会立即执行并返回一个值,而Generator
函数在调用时并不执行函数体,而是返回一个可迭代对象,需要通过迭代器的 next()方法来逐步执行函数体。
另外,普通函数只能通过return
语句返回一个值,而Generator
函数可以通过多个 yield 语句来产生多个值,并且可以在需要的时候终止函数的执行。
总的来说,Generator 函数相比普通函数更灵活,可以用于处理异步操作、实现惰性计算等场景。
更新日志
e7112
-1于