Я уверен, что мое понимание генераторов по своей сути нарушено. Все онлайн-ресурсы, похоже, конфликтуют, и это создает невероятно трудный и запутанный опыт обучения.
Из того, что я понимаю, ключевое слово 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
, похоже, ждет ожидания большинства наиболее распространенных случаев использования, тогда как в части реализации (read: return value to/insidedb.get
)yield
кажется, стоит для отправки этого значения назад к текущему ожидающему блоку, чтобы возобновить выполнение.
Возьмем, например:
function *fn() {
yield 1;
yield "a";
}
var gen = fn();
gen.next(); // 1
gen.next(); // "a";
yield
в этом контексте отправляет значения обратно вниз, а не ждет результатов. В первом примере выше он ожидает результатов от db.get
и возобновляет выполнение вместо "возврата" или отправки значения. Если случай db.get
имеет значение true, не является ли это синхронным? Я имею в виду, это не то же самое, что:
(function() {
//Wait for the results
var results = fs.readFileSync("users.txt");
// Use results
view.display(results);
})();
К сожалению, если это ясно из этого вопроса (возможно, единственное, что ясно), я не понимаю генераторов. Надеюсь, я мог бы получить некоторое представление здесь.