28
ES6. Генераторы Yaroslavl Frontend Meetup #3 Олег Елифантьев, Тензор @oelifantiev

ES6. Генераторы

Embed Size (px)

Citation preview

Page 1: ES6. Генераторы

ES6. Генераторы

Yaroslavl Frontend Meetup #3Олег Елифантьев, Тензор@oelifantiev

Page 2: ES6. Генераторы

2

Непрерывное выполнение

console.log(0);

setTimeout(function() { console.log(1); }, 1);

for(var i = 0; i < 1e10; i++) { console.log('.');}

console.log(2);

Page 3: ES6. Генераторы

3

console.log(0);

setTimeout(function() { console.log(1); }, 1);

for(var i = 0; i < 1e10; i++) { console.log('.');}

console.log(2);

Page 4: ES6. Генераторы

4

0[100500] .21

Page 5: ES6. Генераторы

5

Генераторы• Позволяют описать функцию, которую

можно прерывать в середине выполнения и затем вернуть управление обратно

Page 6: ES6. Генераторы

6

Синтаксисfunction *name() { ...}

Page 7: ES6. Генераторы

7

Синтаксисfunction *name() { ...}

Page 8: ES6. Генераторы

8

Синтаксисfunction *name() { yield;}

Page 9: ES6. Генераторы

9

Синтаксисfunction *name() { yield 42;}

Page 10: ES6. Генераторы

10

Синтаксисfunction *name() { var v = yield 42;}

Page 11: ES6. Генераторы

11

Как работаетfunction *gen(start) { while(true) { yield start++; }}

var it = gen(5);console.log(it.next()); // { value: 5, done: false }console.log(it.next()); // { value: 6, done: false }

Page 12: ES6. Генераторы

12

Как работаетfunction *gen(start) { while(true) { if (start > 20) { return start; } yield start++; }}

var it = gen(21);console.log(it.next()); // { value: 21, done: true }>

Page 13: ES6. Генераторы

13

Как работаетfunction *gen(start) { while(true) { if (start > 20) { return start; } yield start++; }}

var it = gen(20);console.log(it.next()); // { value: 20, done: false }console.log(it.next()); // { value: 21, done: true }

Page 14: ES6. Генераторы

14

Демо. Числа Фибоначчи• http://jsfiddle.net/Olegas/f2w0jqx7/1/

Page 15: ES6. Генераторы

15

Итератор по генераторуfunction *gen() { // ...}

var it = gen();

for(var x of it) { console.log(x);}

Page 16: ES6. Генераторы

16

Итератор по генераторуfunction *gen(start, n) { while(true) { yield start++; if (--n <= 0) { return; } }}

for(var x of gen(10, 2)) { console.log(x); // 10, 11}

Page 17: ES6. Генераторы

17

Обработка ошибокfunction *gen() { yield; // pause throw 'x';}

var it = gen();it.next(); // startit.next(); // BAM! Uncaught x

Page 18: ES6. Генераторы

18

Обработка ошибокfunction *gen() { yield; // pause throw 'x';}

var it = gen();it.next(); // starttry { it.next(); // BAM!} catch(e) { /*...*/ }

Page 19: ES6. Генераторы

19

Обработка ошибокfunction *gen() { try { yield; // BAM! } catch (e) { console.log('Got ' + e); }}

var it = gen();it.next(); // startit.throw('y'); // Got y

Page 20: ES6. Генераторы

20

Вложениеfunction *gen2() { yield 10; yield 20;}

function *gen() { yield 1; yield *gen2();}

for(var d of gen()) { console.log(d); } // 1, 10, 20

Page 21: ES6. Генераторы

21

Демо. AJAX• http://jsfiddle.net/Olegas/nxduy1d8/1/

Page 22: ES6. Генераторы

22

Демо. Конечный автомат• http://jsfiddle.net/Olegas/tc67m5tk/3/

Page 23: ES6. Генераторы

23

Демо. Очередь• http://jsfiddle.net/Olegas/dggysvxy/9/

Page 24: ES6. Генераторы

24

Где работает?

FF 35 Chrome 40 io.js 1.0

Page 25: ES6. Генераторы

25

Где работает?

Node --harmony

Page 26: ES6. Генераторы

26

Транспайлеры

Page 27: ES6. Генераторы

27

Материалы• http://davidwalsh.name/es6-generators• http://kangax.github.io/compat-table/es6/

Page 28: ES6. Генераторы

Вопросы?

Yaroslavl Frontend Meetup #3Олег Елифантьев, Тензор@oelifantiev