Генераторы - это стиль JavaScript стиля Coroutine (Coroutine). Это относится к функциям, которые можно приостановить, а затем возобновить во время исполнения. Функция сопровождается символами звездочки в функции, такими как функция*, и некоторые характерные ключевые слова в функции, такие как выход и выход*.
Функция* GeneratorFn () {console.log ('selied ma i был приостановлен')} var generator = Generatorfn () // [1] settimeout (function () {Generator.next () // [2]}, 2000)[1] и [2], отмеченные в коде, объясняются следующим образом:
1. Это генератор, который начинается с паузы. В настоящее время нет вывода консоли.
2. Только позвонив по следующему () методу, генератор может быть выполнен и запустить, пока он не столкнется с следующим ключевым словом доходности или возвращением. Теперь у нас есть консоль.
Давайте посмотрим на другой случай:
function *Generator () {console.log ('start!'); var i = 0; while (true) {if (i <3) дает i ++; }} var gen = generator ();Приведенный выше код похож на первый, но в функции генератора есть дополнительное ключевое слово доходности. Когда приведен выше код, он не будет выполнен немедленно, но приостановит состояние резервного режима, поэтому не будет начального вывода. Он не выполняется до следующего () вызова.
var ret = gen.next (); // start! console.log (ret); // {value: 0, dode: false}Приведенный выше RET является результатом генератора. У него есть два свойства:
■ Значение, значение доходности в функции генератора,
■ Готово, это флаг, указывающий, возвращает ли функция генератора.
Продолжайте код следующим образом:
console.log (gen.next ()); // {value: 1, dode: false} console.log (gen.next ()); // {value: 2, dose: false} console.log (gen.next ()); // {value: не определено, выполнено: true}Генератор не имеет загадки в синхронном программировании и особенно подходит для асинхронного программирования.
Генератор имеет две характеристики:
1. Вы можете выбрать выпрыгнуть из функции, пусть внешний код решает, когда вернуться к этой функции и продолжить выполнение.
2. Способен выполнять асинхронное управление.
Посмотрите на следующий асинхронный код выполнения:
var gen = Generator (); console.log (gen.next ().
Вывод:
0
Шаг 2
1
Первый шаг
Другими словами, вы не будете ждать, пока тайм -аут завершится в Settimeout, но будет продолжаться напрямую с «вторым шагом» и не будет заблокирована на сборе.
Давайте посмотрим на другой кусок кода:
function* Channel () {var name = willd 'Hello, как ваше имя? // [1] вернуть 'ну, привет' + name} var gen = channel () console.log (gen.next (). Value) // Привет, как ваше имя? [2] console.log (gen.next ('billy')) // Ну привет, Билли [3]Вы также можете использовать * во время обхода:
Функция* iter () {for (var i = 0; i <10; i ++) Glute i} for (var val of iter ()) {console.log (val) // Выходы 1? ―? 9}Обычные недоразумения
Поскольку я могу приостановить выполнение функции, я должен позволить им выполнять параллельно? Нет, потому что JavaScript - это единая ветка, и если вы хотите искать улучшения производительности, генератор не является вашим блюдом.
Например, следующий код выполняет номера Fibonacci отдельно:
Функция fib (n) {var current = 0, next = 1, swap for (var i = 0; i <n; i ++) {swap = current, current = next next = swap+next} возвращаемый ток}* fibgen (n) {var current = 0, next = 1, swap for (var i = 0; i <n) {swap = current Next = next = next = next = necke = necke = inme = wap}}})Результаты производительности следующие: (чем выше, тем лучше)
Результаты:
Обычный 1263899
Генератор 37541
Генераторы сияют
Генераторы могут упростить сложность функций в JavaScript.
Ленивое задание
Хотя ленивое задание может быть реализовано с использованием закрытия JS, использование урожайности значительно упростит. Благодаря паузе и восстановлению мы можем получить числовые значения, когда нам это нужно. Например, вышеуказанная функция FibGen может приносить новые значения, когда нам это нужно:
var fibiter = fibgen (20) var next = fibiter.next () console.log (next.value) settimeout (function () {var next = fibiter.next () console.log (next.value)}, 2000) Конечно, он также использует для петли: n nazy grate (var n of fibgen (20) {ass).Бесконечная последовательность
Поскольку вы можете быть лень назначать значения, вы можете выполнить некоторые уловки Haskell, аналогичные бесконечным последовательностям. Здесь вы можете дать количество бесконечной последовательности.
Функция* fibgen () {var current = 0, next = 1, swap while (true) {swap = current, current = next next = swap + next it -tecall}}}}}}}}}}}}}}Давайте посмотрим на ленивое задание потока Фибоначчи и попросим его вернуть первый номер Фибоначчи после 5000:
для (var num of fibgen ()) {if (num> 5000) break} console.log (num) // 6765Асинхронное управление процессом
Использование генераторов для реализации асинхронного управления процессом, чаще всего различных пакетов библиотеки перспективных библиотеков, так как это работает?
В мире узлов все связано с обратными вызовами, которые являются нашей асинхронной функцией низкого уровня. Мы можем использовать генераторы для создания канала связи, чтобы написать асинхронный код в стиле синхронного программирования.
run (function* () {console.log ("start") var file = uild readfile ("./ async.js") // [1] console.log (file.tostring ())})ПРИМЕЧАНИЕ 1 означает, что программа будет продолжаться, прежде чем ждать Async.JS, чтобы вернуть результат.
Genify - это структура, которая привносит генераторы в обычную среду программирования, используя следующее:
NPM установить Genify для установки, код выглядит следующим образом:
var q = require ('q'); var fs = require ('fs'); var genify = require ('genify'); // Оберните свой объект в Genify functionVar object = genify ({concatFiles: function * (file1, file2, outfile) {file1 = gill q.nfcall (fs.readfile, file1); file2 = gill q.nfcall (fs.readfile, file2); var concepted = file1; }}); // concatfiles - это функция генератора, которая использует мощные возможности генераторов. object.concatfiles ('./ somefile1.txt', './somefile2.txt', './concated.txt').then(function (res) {// Сделать что -нибудь с результатом}, function (err) {// делать что -то с ошибкой});Приведенное выше подробное объяснение использования генераторов JavaScript в node.js является всем контентом, которым я делюсь с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.