Генераторы Javascript: Понимание их
Я уверен, что мое понимание генераторов по своей сути нарушено. Все онлайн-ресурсы кажутся конфликтующими, и это делает процесс обучения невероятно сложным и запутанным.
Из того, что я понимаю,yield
Ключевое слово позволяет блоку кода, который выполняется в данный момент,ждать значения вместо того, чтобы бросать оставшийся код для выполнения внутри обратного вызова. Итак, как указывало большинство уроков, вы можете использовать это:
(function *() {
// Wait until users have be got and put into value of `results`
var results = yield db.get("users");
// And continue
view.display(results);
})();
Вместо:
db.get("user", function(results) {
view.display(results);
});
Правильно, этоВсе хорошо, пока я не попытаюсь написать свои собственные генераторы. Я'мы столкнулись с несколькими заминками:
Первый пример кода, который я выше, не будет работать, потому что нечего перебирать генератор, правильно? Некоторое высшее существо должно назвать.next
где-то, верно?Весь API должен быть переписан вплоть до вызовов ввода / вывода для поддержки генераторов, верно?Из того, что я собираю,yield
кажется, стоит заждать значения наиболее общие случаи использования, тогда как в части реализации (читай: возвращаем значение в / inside)db.get
yield
кажется, стоит заотправить это значение обратно в текущий ожидающий блок, чтобы возобновить выполнение.Взять, к примеру:
function *fn() {
yield 1;
yield "a";
}
var gen = fn();
gen.next(); // 1
gen.next(); // "a";
yield
в этом контексте отправка значений обратно вниз вместо ожидания результатов. В первом примере, приведенном выше, он ожидает результатов отdb.get
и возобновляет выполнение вместо "возвращение» или отправив обратно значение. Еслиdb.get
Случай верен, это не по своей сути синхронно? Я имею в виду, неТ точно так же, как:
(function() {
//Wait for the results
var results = fs.readFileSync("users.txt");
// Use results
view.display(results);
})();
К сожалению, если этоЛюбой способ ясно из этого вопроса (вероятно, единственное ясное) состоит в том, что я нене понимаю генераторов. Надеюсь, я мог бы получить некоторое представление здесь.