Автор оригинала: FreeCodeCamp Community Member.
Sanket Meghani
Генераторы являются одним из ключевых функций, представленных в ES6. Вопреки нормальным функциям, которые могут быть введены только в начале функции, генераторы являются функциями, которые могут быть выведены и повторно введены позже с их контекстом (переменные привязки), сохраненные через повторные входы. Другими словами, функция генератора может вернуть значение Midway и возобновить его выполнение из полпути позже.
Генератор может быть определен с использованием ключевого слова функции, а затем звездочка.
Разница между вызовом нормальной функции и функцией итератора заключается в том, что вызывающая функция генератора не выполняет функцию генератора немедленно. Вместо этого возвращает объект итератора для генератора. Чтобы выполнить тело генератора, нам нужно позвонить следующему () методу на возвращенном итераторе.
let generator = myFirstGenerator(5);let output = generator.next();
Когда требуется следующий () метод итератора, тело функции генератора выполняется до первого выражения дохода. Выходное выражение указывает значение, которое будет возвращено. В приведенном выше примере генератор вызова .Next () будет выполнять первую кнопку COUSOLE.LOG () и возвратный вывод (A + 5). Далее () метод возвращает объект в следующей структуре.
{ value: 10, //Return value of yield expression. I.e 5 + 5 done: false //Weather generator has yielded it's last value}
Мы можем распечатать возвращенную текущую стоимость с использованием свойства Value возвращаемого объекта.
let generator = myFirstGenerator(5);let output = generator.next(); //output = {value: 10, done: false}
console.log('Output is: ', output.value); //Output is: 10
Вызов следующей () снова на итераторе продолжат выполнить выполнение генератора с последнего выражения доходности до тех пор, пока не будет обнаружено следующее выражение дохода или оператора возврата.
output = generator.next(10); //output = {value: 15, done: true}
В нашем примере генератор вызова .Next (10) возобновит выполнение генератора из строки 4 с последним значением экспрессии доходности 10 (значение I.E, передаваемое на следующую ()). Следовательно, линия 4 будет оценена как + 10, в результате чего. В строке 7 он возвращает значение B, и, поскольку это последнее оператор возврата (I.E: больше не осталось), выполнено, сделано для True.
Вызов следующего () метода с аргументом возобновит выполнение функции генератора, заменив оператор текучести, где выполнение было приостановлено с аргументом с следующего ().
output = generator.next(15); //output = {value: 20, done: true}
Calling Generator.Next (15) возобновит выполнение генератора из строки 4 с последним значением экспрессии, замененным на 15. Отсюда линию 4 будет оценена как + 15 в результате чего.
Мы можем использовать доходность * для делегирования другой функции генератора.
Пост
Это довольно интригует, как эта новая функция может быть использована на практике. Redux-Saga Использует генераторные функции, чтобы облегчить писать асинхронные потоки. Мы только что поцарапали поверхность, и к ним намного больше. Я хотел бы услышать ваши комментарии, предложения или вопросы вокруг генераторов ES6, и это использование случаев:).