协程 是一种函数,其执行可以被暂停和恢复,可能传递一些数据。它们恰好适用于实现涉及不同任务/函数之间合作的各种模式,比如异步流。
在 JavaScript 中
在 JavaScript 中,你可以使用生成器函数来实现(类似)协程。你可能已经使用生成器函数来实现迭代器和序列。
function *integers(){
let n = 0;
while(true){
yield ++n;
}
}
const sequence = integers();
console.log(sequence.next().value); // > 1
console.log(sequence.next().value); // > 2
console.log(sequence.next().value); // > 3
console.log(sequence.next().value); // > 4
这里的 while(true)
很有趣(而且完全没问题),因为它证明了生成器正在惰性地被评估。当你调用 next
函数时,实际上是执行生成器,直到下一个 yield
语句。yield
右侧表达式的结果成为迭代器结果的 value
,然后生成器函数暂停。
我们通常不知道的是,当恢复例程的执行时,你可以向 next
函数传递数据,这样做的效果是将该数据分配给语句“左侧”的任何变量:
function *generator() {
while(true){
const action = yield;
console.log(action)
}
}
const routine = generator();
routine.next();
routine.next('increment'); // > 'increment'
r