Javascript 当停止发电机时,环路的中断是如何工作的?
因此,有一些方法可以停止Javascript 当停止发电机时,环路的中断是如何工作的?,javascript,loops,ecmascript-6,for-of-loop,Javascript,Loops,Ecmascript 6,For Of Loop,因此,有一些方法可以停止for of循环中的发电机,但是中断如何向发电机发送信号(与for of中的返回相比) 请考虑代码。 例如,前面的代码只是将一个值从1增加到10,并在两者之间执行暂停和恢复 function *Generator() { try { var nextValue; while (true) { if (nextValue === undefined) { nextValue
for of
循环中的发电机,但是中断
如何向发电机发送信号(与for of
中的返回
相比)
请考虑代码。
例如,前面的代码只是将一个值从1增加到10,并在两者之间执行暂停和恢复
function *Generator() {
try {
var nextValue;
while (true) {
if (nextValue === undefined) {
nextValue = 1;
}
else {
nextValue++;
}
yield nextValue;
}
}
// cleanup clause
finally {
console.log( "finally has been reached." );
}
}
它通过使用for of在其上循环10次:
var it = Generator();// it gets Generator's iterator
for (var v of it) {
console.log(v);
if (v > 9) {
//it.return("stop");//this is another tool for stopping, but it doesn't stop immediately.
break;
console.log("it won't run");//this line won't run
}
}
当顺便使用
it.return()
时,实现是清晰的(it
是主要对象,并且已经得到了控制,但是break
呢?) Iterable对象(如it
generator对象)具有键为符号的属性。迭代器是返回迭代器的函数。迭代器需要有一个.next()
方法才能从一项前进到下一项。然后还可以选择使用.return()
方法,该方法在中断
、返回
、或抛出
时调用,从而使for..of
在运行完成之前停止。所以在你的情况下,break
将自动调用it.return()
另一方面,在ES6生成器上,.next()
使其在当前暂停的yield
处恢复执行,.return()
使其行为类似于yield
是一个return
语句,因此循环内的break
导致yield nextValue
表现得像返回代码>,它将退出生成器并最终触发块
break
如何向发电机发送信号
循环将调用,这基本上相当于调用迭代器的.return()
方法,如果迭代器对象有这样的方法,则不带任何参数—生成器就是这样做的。
当对循环体中的throw
或return
语句求值时,也会发生这种情况
当顺便使用it.return()
…但很可怕。正如你所发现的,它不会立即停止。这是因为方法调用只是推进生成器并从中返回一些结果,而与循环无关。循环体将继续执行,直到再次计算循环条件,然后检查迭代器并注意它已经完成。您正在中断for循环,使用break
会发生什么?您不应该只写“return;”退出循环而不是“it.return(“stop”);”,另外,你在循环内使用了break,它无论如何都应该跳出循环。不完全确定你在问什么-但是break用于跳出循环(并继续循环外的任何方法)。Return将突破一个方法,而不仅仅是一个循环,它还可以返回一个值。Break不返回值。好的,我要补充一个更清晰的问题。你为什么命名函数Generator
?我很感激,你在我的例子中说Break
将自动调用it.return()
,但它只是把{done:true}
放在位置,这意味着我们实际上并没有打破循环体的,我们刚刚告诉迭代器它已经完成了。那么调用it.return()后break
终止它自己的循环迭代?(它做两件事对吗?@MehdiRaash你说的“但它只是把{done:true}
”是什么意思?不,break
像往常一样脱离循环,然后for
将调用it.return()
,然后继续循环后的下一个语句。是的,你从来没有调用过it.return()
你自己和for..of
,就像你从来没有调用it.next()
你自己一样。在循环中放置一个中断
,将为您调用。return
。