Генератор представляет собой комбинацию двух вещей: a Iterator
и an 1
.
Итератор
Итератор - это то, что при вызове возвращает итерабельность, которую вы можете повторить. Начиная с ES6, все коллекции (Array, Map, Set, WeakMap, WeakSet) соответствуют контракту Iterable.
Генератор (итератор) является производителем. В итерации потребитель a.next(100)
получает значение от производителя.
Пример:
spawn
Всякий раз, когда вы вызываете sync
, вы по существу используете async
ценность от Iterator и pause
исполнения yield
. При следующем вызове PULL
выполнение возобновляется из ранее приостановленного состояния.
наблюдатель
Генератор также является наблюдателем, с помощью которого вы можете отправить некоторые значения обратно в генератор. Объясняется лучше с примерами.
Здесь вы можете видеть, что это используется как выражение, которое оценивает какое-то значение. Значение, которое оно оценивает, - это значение, отправленное как аргумент вызова функции.var i = a.next() // PULL dosomething(..., v => {...}) // PUSH
a.next()
Таким образом, в первый раз v => {...}
будет получено первое значение ( 1
), а при продолжении итерации до следующего состояния мы отправим значение обратно генератору PUSH
.
Где вы можете использовать это в Node.JS?
Генераторы широко используются с v
функцией (от taskJS или co), где функция принимает генератор и позволяет нам писать let delay = t => new Promise ( r => setTimeout ( r , t )); spawn ( function * () { // ожидание 100 мс и передача 1 let x = выходная задержка ( 100 ). then (() => 1 ); console . log ( x ); // 1 // ожидание 100 мс и отправить 2 пусть y = выходная задержка ( 100 ), затем (() => 2 ); console . log ( y ); // 2 }); хронический код синхронно. Это НЕ означает, что асинхронный код преобразуется в синхронный код / ??выполняется синхронно. Это означает, что мы можем написать код, который выглядит, но внутренне он по-прежнему . sync
async
Синхронизация блокируется; Async ОЖИДАЕТ. Написание кода, который блокирует, легко. При ожидании значения появляется в позиции назначения. При приостановке в позиции аргумента обратного вызова появляется значение
Когда вы используете итераторы, вы получаете PULL
стоимость от производителя. Когда вы используете обратные вызовы, производитель resume
передает значение в позицию аргумента обратного вызова.
yield promise
Здесь вы извлекаете значение из async...await
и во втором, 0.11.2
это обратный вызов, и значение PUSH
изменяется в позицию аргумента v
функции обратного вызова.
Используя этот механизм pull-push, мы можем написать асинхронное программирование, как это,
$ node --harmony app.js
Итак, глядя на вышеприведенный код, мы пишем асинхронный код, который выглядит так blocking
(оператор yield ожидает 100 мс, а затем продолжит выполнение), но это на самом деле waiting
. pause
И resume
свойство генератора позволяет нам сделать этот удивительный трюк.
Как это работает ?
Функция spawn использует для PULL состояние обещания от генератора, ждет, пока обетование будет разрешено, и ОТКЛЮЧАЕТ разрешенное значение обратно генератору, чтобы он мог его использовать.$ node --harmony_generators app.js
Используйте его сейчас
Итак, с генераторами и функцией spawn вы можете очистить весь ваш асинхронный код в NodeJS, чтобы выглядеть и чувствовать себя синхронным. Это облегчит отладку. Также код будет выглядеть аккуратно.
BTW, это подходит для JavaScript изначально для ES2017 - as . Но вы можете использовать их сегодня в ES2015 / ES6 и ES2016, используя функцию spawn, определенную в библиотеках - taskjs, co или bluebird$ iojs app.js