Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当停止发电机时,环路的中断是如何工作的?_Javascript_Loops_Ecmascript 6_For Of Loop - Fatal编程技术网

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