Учебники

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 () запускает генератор и работает до тех пор, пока не достигнет доходности. Затем он возвращает объект со значением и выполнено, где значение имеет значение выражения. Это выражение может быть чем угодно. На этом этапе он приостанавливает выполнение. Опять же, когда мы вызываем эту функцию (далее), генератор возобновляет выполнение с последней точки доходности, причем состояние функции остается неизменным во время паузы, до следующей точки доходности. Это делается до тех пор, пока в коде больше не будет точек доходности.

Генераторы в Коа

Итак, почему мы обсуждаем генераторы в этом уроке. Как вы, наверное, помните из программы hello world, мы использовали нотацию функции * () для передачи обратного вызова в app.use (). 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

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