当停止 Generator 时,Break 在 for-of 循​​环中如何工作?

Meh*_*ash 5 javascript loops ecmascript-6 for-of-loop

因此,有一些方法可以停止循环中的生成器for of,但是如何break向生成器发送信号(与returnin相比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." );
    }
}
Run Code Online (Sandbox Code Playgroud)

它通过使用循环 10 次for of

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
    }
} 
Run Code Online (Sandbox Code Playgroud)

it.return()顺便说一句,当使用 时,实现的clear( 是主对象并且已经获得了控制权,但是?);it呢?break

Ber*_*rgi 2

\n

如何break向生成器发送信号?

\n
\n\n

循环将调用IteratorClose操作,这基本上相当于调用.return()不带参数的迭代器方法(如果迭代器对象有这样的方法)——生成器就是这样做的。\n当循环体中的throworreturn语句被求值时,也会发生这种情况。

\n\n
\n

it.return()顺便什么时候用,实现就清楚了

\n
\n\n

\xe2\x80\xa6但是太可怕了。正如您所发现的,它不会立即停止。这是因为方法调用只是推进生成器并从中返回一些结果,但与循环无关。循环体将继续执行,直到再次评估循环条件为止,然后循环体将检查迭代器并注意到它已经完成。

\n