在使用Generator函数时,我们可以传值给next方法,再次调用Generator函数时,我们可以在上次退出Generator函数的yield
表达式处使用该值。让我们通过以下例子,来了解这一特性:
code/generators/pass-next.js
function* myGenerator(n) {
const a = (yield 10) + n
yield a
}
const g = myGenerator(1)
g.next().value // --> 10
g.next(100).value // --> 101
分析上面的代码,看看都发生了些什么:
- 首先,我们使用参数1调用了Generator函数,并把返回的Generator对象赋值给变量
g
。这里没有什么特别的。 - 接着,我们调用
g.next
开始执行Generator函数,当碰到第一个yield
表达式(const a =(yield 10)
)时退出。此时,生成的值为10。 - 再次,我们调用
g.next
,并传入参数100。Generator函数恢复执行,并从+ n
的地方开始,但不再使用(yield 10)
,而是使用参数100替换它。所以,最终为const a = 100 + n
,此时n为1。直到执行到下一个yield
表达式之前,该函数退出。所以,生成的值为101。
在后续部分,我们将使用Generator函数的这一特性来处理一些异步任务。