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