Koa.js - Генераторы
Одна из самых захватывающих новых возможностей JavaScript ES6 - это новый вид функций, называемый генератором. До генераторов весь сценарий обычно выполнялся в порядке сверху вниз, без простого способа остановить выполнение кода и возобновить его с тем же стеком позже. Генераторы - это функции, из которых можно выйти, а затем снова войти. Их контекст (привязки переменных) будут сохраняться при повторных входах.
Генераторы позволяют нам останавливать выполнение кода между ними. Итак, давайте посмотрим на простой генератор.
var generator_func = function* (){
yield 1;
yield 2;
};
var itr = generator_func();
console.log(itr.next());
console.log(itr.next());
console.log(itr.next());
При выполнении приведенного выше кода результат будет следующим.
{ value: 1, done: false }
{ value: 2, done: false }
{ value: undefined, done: true }
Заглянем внутрь приведенного выше кода. Сначала мы создаем генератор под названиемgenerator_func(). Мы создали экземпляр этой странно выглядящей функции и назначили егоitr. Потом мы начали звонитьnext() по этой переменной itr.
Вызов next () запускает генератор и работает до тех пор, пока не достигнет yield. Затем он возвращает объект со значением и готово, где значение имеет значение выражения. Это выражение может быть любым. На этом этапе выполнение приостанавливается. Опять же, когда мы вызываем эту функцию (next), генератор возобновляет выполнение с последней точки доходности, при этом состояние функции остается неизменным во время паузы, до следующей точки доходности. Это делается до тех пор, пока в коде не останется точек доходности.
Генераторы в Коа
Итак, почему мы обсуждаем генераторы в этом руководстве. Как вы, возможно, помните из программы hello world, мы использовалиfunction* ()нотация для передачи обратного вызова app.use (). Koa - это объект, который содержит массив функций генератора промежуточного программного обеспечения, все из которых составляются и выполняются в виде стека при каждом запросе. Koa также реализует нисходящий поток с последующим восходящим потоком управления.
Взгляните на следующий пример, чтобы лучше понять это.
var koa = require('koa');
var app = koa();
app.use(function* (next) {
//do something before yielding to next generator function
//in line which will be 1st event in downstream
console.log("1");
yield next;
//do something when the execution returns upstream,
//this will be last event in upstream
console.log("2");
});
app.use(function* (next) {
// This shall be 2nd event downstream
console.log("3");
yield next;
// This would be 2nd event upstream
console.log("4");
});
app.use(function* () {
// Here it would be last function downstream
console.log("5");
// Set response body
this.body = "Hello Generators";
// First event of upstream (from the last to first)
console.log("6");
});
app.listen(3000);
При запуске вышеуказанного кода и переходе к https://localhost:3000/ мы получаем на нашей консоли следующий вывод.
1
3
5
6
4
2
По сути, именно так Коа использует генераторы. Это позволяет нам создавать компактное промежуточное ПО с использованием этого свойства и писать код для функций как восходящего, так и нисходящего потока, тем самым избавляя нас от обратных вызовов.