Geradores Javascript: entendendo-os

Tenho certeza de que meu entendimento de geradores é inerentemente quebrado. Todos os recursos on-line parecem conflitar e contribuem para uma experiência de aprendizado incrivelmente difícil e confusa.

Pelo que entendi, oyield A palavra-chave permite que um bloco de código em execução no momentoaguarde um valor em vez de lançar o código restante a ser executado dentro de um retorno de chamada. Portanto, como a maioria dos tutoriais apontou, você pode usar o seguinte:

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

Ao invés de:

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

Certo, tudo está bem até que eu tente escrever meus próprios geradores. Eu já tive vários problemas:

O primeiro código de exemplo acima não será executado porque não há nada para iterar no gerador, correto? Algum ser superior tem que chamar o.next em algum lugar, certo?A API inteira terá que ser reescrita até as chamadas de E / S para dar suporte aos geradores, correto?Pelo que eu entendo,yield parece representaraguarde o valor casos de uso mais gerais, enquanto na parte de implementação (leia-se: valor de retorno para / dentrodb.get) yield parece representarenvie esse valor de volta ao bloco atualmente em espera para retomar a execução.

Considere por exemplo:

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

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

yield nesse contexto, está enviando valores de volta em vez de esperar pelos resultados. No primeiro exemplo acima, aguarda os resultados dodb.get e retoma a execução em vez de "retornar" ou enviar um valor. Se odb.get case for true, isso não é inerentemente síncrono? Quero dizer, não é exatamente o mesmo que:

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

Infelizmente, se está bem claro nesta questão (provavelmente a única coisa clara) é que eu não entendo geradores. Espero que eu possa ter algumas dicas aqui.

questionAnswers(3)

yourAnswerToTheQuestion