見積もり:
オペレーターはyield*
別のジェネレーターに委任します。これは、ジェネレーターを構成するための便利なメカニズムを提供します。
式yield* <<expr>>
は次と同等です。
let (g = <<expr>>) {
let received = void 0, send = true, result = void 0;
try {
while (true) {
let next = send ? g.send(received) : g.throw(received);
try {
received = yield next;
send = true;
} catch (e) {
received = e;
send = false;
}
}
} catch (e) {
if (!isStopIteration(e))
throw e;
result = e.value;
} finally {
try { g.close(); } catch (ignored) { }
}
result
}
これは、外側のジェネレーターのメソッドを介してスローされた例外を委任されたfor-in
ジェネレーターに伝播することを除いて、ジェネレーターのループに似ています。throw
ソース:
http://wiki.ecmascript.org/doku.php?id=harmony:generators#delegating_yield
私はそれを完全に理解するのに多くの時間を費やしていませんが、私が間違っている場合は修正するのyield* gen;
と似ているようです (ただし、例外のコンテキストなど、いくつかのまれなケースがあると完全に疑っています)。yield gen();