The generator of ES6
id:paulownia / @nullpon
2013/12/19

koa 0.1.0 release
koa

•

node.jsのWebアプリケーションフレームワーク

•

ECMAScript 6thのgeneratorを使用
Generator ?
generator

•

イテレータを生成する特殊な関数。
Iterator ?
Iterator

•

ECMAScript 6thで導入

•

反復処理を行うためのオブジェクト
var arr = [3, 4, 5, 6];
!

for (var i of arr) {
console.log(i);
}

// => 3, 4, 5, 6
Iteratorを自作
function range(a, b) {
var i = a;
return {
iterator: function() {
return this;
},
next: function() {
if (i <= b) {
return ...
Generatorで書き直す
function* range(a, b) {
for (var i = a; i <= b; i++) {

yield i;

}
}
!

for (var i of range(3, 6)) {
console.log(i);
// =...
Generatorの挙動
// Generator関数定義
function* f(i) {
var x;

x = yield 1;
// x => "a"
x = yield 2;
// x => "b"
x = yield 3;
// x => "c"
}



...
•

Generator#nextを呼び出す

→ Generator関数の最初のyield式まで実行される

→ yield式を評価し、Generator関数は停止する

→ 制御がnextを呼び出した側に戻る

•

さらにGenertor...
yield式を評価して中断

↓
非同期処理の制御に使えそうだ…
var g = (function* (i) {
console.log(i);
// すぐに 1 が出力
i = yield setTimeout(function() {
g.next(2);
}, 1000);
console.log(i...
まとめ

•

ジェネレータで非同期処理ができる

•

本来は反復処理のための機能

•

node 0.12で使えるようになるらしい

(node 0.11はES6 draftと実装が異なる)
Upcoming SlideShare
Loading in …5
×

The Generator of ECMAScript 6th

1,291 views

Published on

ECMAScript 6thのジェネレータについて。

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,291
On SlideShare
0
From Embeds
0
Number of Embeds
579
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

The Generator of ECMAScript 6th

  1. 1. The generator of ES6 id:paulownia / @nullpon
  2. 2. 2013/12/19
 koa 0.1.0 release
  3. 3. koa • node.jsのWebアプリケーションフレームワーク • ECMAScript 6thのgeneratorを使用
  4. 4. Generator ?
  5. 5. generator • イテレータを生成する特殊な関数。
  6. 6. Iterator ?
  7. 7. Iterator • ECMAScript 6thで導入 • 反復処理を行うためのオブジェクト
  8. 8. var arr = [3, 4, 5, 6]; ! for (var i of arr) { console.log(i); } // => 3, 4, 5, 6
  9. 9. Iteratorを自作
  10. 10. function range(a, b) { var i = a; return { iterator: function() { return this; }, next: function() { if (i <= b) { return { value: i++ }; } else { return { done: true }; } }
 } } ! for (var i of range(3, 6)) { console.log(i); // => 3, 4, 5, 6 }
  11. 11. Generatorで書き直す
  12. 12. function* range(a, b) { for (var i = a; i <= b; i++) {
 yield i;
 } } ! for (var i of range(3, 6)) { console.log(i); // => 3, 4, 5, 6 }
  13. 13. Generatorの挙動
  14. 14. // Generator関数定義 function* f(i) { var x;
 x = yield 1; // x => "a" x = yield 2; // x => "b" x = yield 3; // x => "c" }
 
 // Generator関数実行 // この時点ではGenerator関数のコードは実行されない var g = f(0); // g => [Object: Generator] // nextを呼ぶと、Generator関数のコードが実行される var x;
 x = g.next(); // x => {value:1, done:false} x = g.next("a"); // x => {value:2, done:false} x = g.next("b"); // x => {value:3, done:false} x = g.next("c"); // x => {done:true}
  15. 15. • Generator#nextを呼び出す
 → Generator関数の最初のyield式まで実行される
 → yield式を評価し、Generator関数は停止する
 → 制御がnextを呼び出した側に戻る • さらにGenertor#nextを呼び出す
 → 中断位置から次のyield式まで実行
 → yield式を評価し、Generator関数は再度停止する
 → 制御がnextを呼び出した側に戻る
  16. 16. yield式を評価して中断
 ↓ 非同期処理の制御に使えそうだ…
  17. 17. var g = (function* (i) { console.log(i); // すぐに 1 が出力 i = yield setTimeout(function() { g.next(2); }, 1000); console.log(i); // 1秒待って 2 が出力 ! i = yield setTimeout(function() { g.next(3); }, 1000); console.log(i); // 1秒待って 3 が出力 })(1); ! g.next();
  18. 18. まとめ • ジェネレータで非同期処理ができる • 本来は反復処理のための機能 • node 0.12で使えるようになるらしい
 (node 0.11はES6 draftと実装が異なる)

×