Generatory Javascript: ich zrozumienie

Jestem pewien, że moje rozumienie generatorów jest z natury zepsute. Wszystkie zasoby online wydają się być sprzeczne i sprawiają, że nauka staje się niezwykle trudna i myląca.

Z tego co rozumiemyield Słowo kluczowe umożliwia wykonanie aktualnie wykonywanego bloku kodupoczekaj na wartość zamiast rzucać pozostały kod do wykonania w wywołaniu zwrotnym. Tak więc, jak wskazano w większości samouczków, można tego użyć:

(function *() {
     // Wait until users have be got and put into value of `results`
     var results = yield db.get("users");
     // And continue
     view.display(results);
})();

Zamiast:

db.get("user", function(results) {
    view.display(results);
});

To dobrze, dopóki nie spróbuję napisać własnych generatorów. Wpadłem na kilka przeszkód:

Pierwszy przykładowy kod, którego powyżej nie uruchomię, ponieważ nie ma nic do iteracji po generatorze, prawda? Jakaś wyższa istota musi zadzwonić do.next gdzieś, prawda?Cały interfejs API będzie musiał zostać przepisany aż do wywołań I / O w celu wsparcia generatorów, prawda?Z tego co zebrałem,yield zdaje się oznaczaćpoczekaj na wartość najbardziej ogólne przypadki użycia, podczas gdy w części implementacyjnej (czytaj: zwracaj wartość do / wewnątrzdb.get) yield zdaje się oznaczaćwyślij tę wartość z powrotem do aktualnie oczekującego bloku, aby wznowić wykonywanie.

Weź na przykład:

function *fn() {
    yield 1;
    yield "a";
}

var gen = fn();
gen.next(); // 1
gen.next(); // "a";

yield w tym kontekście wysyła z powrotem wartości zamiast czekać na wyniki. W pierwszym przykładzie powyżej czeka na wyniki zdb.get i wznawia wykonywanie zamiast „zwracać” lub odesłać wartość. Jeślidb.get przypadek jest prawdziwy, czy to nie jest z natury zsynchronizowane? To znaczy, czy to nie dokładnie to samo co:

(function() {
     //Wait for the results
    var results = fs.readFileSync("users.txt");
    // Use results
    view.display(results);
})();

Niestety, jeśli z tego pytania jest jakaś jasność (prawdopodobnie jedyna rzecz jasna), to nie rozumiem generatorów. Miejmy nadzieję, że będę mógł uzyskać tutaj pewien wgląd.

questionAnswers(3)

yourAnswerToTheQuestion