2

次のジェネレータ関数があるとしましょう。

var gen1 = function * (){
  yield 1;
};

そして、上記のジェネレーターを生成するジェネレーターがさらに 2 つあります。

var gen2 = function * () {
    yield gen1;
};

var gen3 = function * () {
    yield *gen1;
};

の違いを知っている人はいますかyield gen1 yield *gen1*ジェネレーターに何をしますか?

4

2 に答える 2

1

見積もり:

オペレーターは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();

于 2014-03-28T23:30:44.903 に答える