Generadores de Javascript: entendiéndolos

Estoy bastante seguro de que mi comprensión de los generadores está intrínsecamente dañada. Todos los recursos en línea parecen estar en conflicto y se convierten en una experiencia de aprendizaje increíblemente difícil y confusa.

De lo que entiendo, elyield La palabra clave habilita un bloque de código actualmente en ejecución paraesperar un valor En lugar de lanzar el código restante para ser ejecutado dentro de una devolución de llamada. Entonces, como la mayoría de los tutoriales han señalado, puedes usar esto:

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

En lugar de:

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

Bien, todo está bien hasta que intento escribir mis propios generadores. Me he topado con varios enganches:

El primer código de ejemplo I anterior no se ejecutará porque no hay nada que iterar sobre el generador, ¿correcto? Algún ser superior tiene que llamar al.next en algun lugar verdadLa API completa deberá reescribirse hasta las llamadas de E / S para que sean compatibles con los generadores, ¿correcto?Por lo que sé,yield parece estar parado paraespera el valor la mayoría de los casos de uso, mientras que en la parte de implementación (lea: devuelva el valor a / insidedb.get) yield parece estar parado paraenviar este valor de nuevo al bloque en espera para reanudar la ejecución.

Tomar como ejemplo:

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

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

yield en ese contexto es enviar valores de nuevo hacia abajo en lugar de esperar los resultados. En el primer ejemplo anterior, espera los resultados de ladb.get y se reanuda la ejecución en lugar de "devolver" o devolver un valor. Si eldb.get el caso es cierto, ¿no es esto inherentemente síncrono? Quiero decir, no es exactamente lo mismo que:

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

Desafortunadamente, si queda claro de esta pregunta (probablemente lo único claro) es que no entiendo a los generadores. Con suerte, podría tener alguna idea aquí.

Respuestas a la pregunta(3)

Su respuesta a la pregunta