Upload
oelifantiev
View
371
Download
6
Embed Size (px)
Citation preview
ES6. Генераторы
Yaroslavl Frontend Meetup #3Олег Елифантьев, Тензор@oelifantiev
2
Непрерывное выполнение
console.log(0);
setTimeout(function() { console.log(1); }, 1);
for(var i = 0; i < 1e10; i++) { console.log('.');}
console.log(2);
3
console.log(0);
setTimeout(function() { console.log(1); }, 1);
for(var i = 0; i < 1e10; i++) { console.log('.');}
console.log(2);
4
0[100500] .21
5
Генераторы• Позволяют описать функцию, которую
можно прерывать в середине выполнения и затем вернуть управление обратно
6
Синтаксисfunction *name() { ...}
7
Синтаксисfunction *name() { ...}
8
Синтаксисfunction *name() { yield;}
9
Синтаксисfunction *name() { yield 42;}
10
Синтаксисfunction *name() { var v = yield 42;}
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 }
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 }>
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 }
14
Демо. Числа Фибоначчи• http://jsfiddle.net/Olegas/f2w0jqx7/1/
15
Итератор по генераторуfunction *gen() { // ...}
var it = gen();
for(var x of it) { console.log(x);}
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}
17
Обработка ошибокfunction *gen() { yield; // pause throw 'x';}
var it = gen();it.next(); // startit.next(); // BAM! Uncaught x
18
Обработка ошибокfunction *gen() { yield; // pause throw 'x';}
var it = gen();it.next(); // starttry { it.next(); // BAM!} catch(e) { /*...*/ }
19
Обработка ошибокfunction *gen() { try { yield; // BAM! } catch (e) { console.log('Got ' + e); }}
var it = gen();it.next(); // startit.throw('y'); // Got y
20
Вложениеfunction *gen2() { yield 10; yield 20;}
function *gen() { yield 1; yield *gen2();}
for(var d of gen()) { console.log(d); } // 1, 10, 20
22
Демо. Конечный автомат• http://jsfiddle.net/Olegas/tc67m5tk/3/
23
Демо. Очередь• http://jsfiddle.net/Olegas/dggysvxy/9/
24
Где работает?
FF 35 Chrome 40 io.js 1.0
25
Где работает?
Node --harmony
26
Транспайлеры
27
Материалы• http://davidwalsh.name/es6-generators• http://kangax.github.io/compat-table/es6/
Вопросы?
Yaroslavl Frontend Meetup #3Олег Елифантьев, Тензор@oelifantiev