Генератор представляет собой комбинацию двух вещей: 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 => {...}) // PUSHa.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 }); хронический код синхронно. Это НЕ означает, что асинхронный код преобразуется в синхронный код / ??выполняется синхронно. Это означает, что мы можем написать код, который выглядит, но внутренне он по-прежнему . syncasync
Синхронизация блокируется; 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