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

По сути, именно так Коа использует генераторы. Это позволяет нам создавать компактное промежуточное ПО с использованием этого свойства и писать код для функций как восходящего, так и нисходящего потока, тем самым избавляя нас от обратных вызовов.