the generator of ecmascript 6th

Post on 16-Jun-2015

957 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

The generator of ES6id:paulownia / @nullpon

2013/12/19koa 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 { value: i++ }; } else { return { done: true }; } } } } !for (var i of range(3, 6)) { console.log(i); // => 3, 4, 5, 6 }

Generatorで書き直す

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 }

Generatorの挙動

// 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}

• Generator#nextを呼び出す→ Generator関数の最初のyield式まで実行される→ yield式を評価し、Generator関数は停止する→ 制御がnextを呼び出した側に戻る

• さらにGenertor#nextを呼び出す→ 中断位置から次のyield式まで実行→ yield式を評価し、Generator関数は再度停止する→ 制御がnextを呼び出した側に戻る

yield式を評価して中断↓

非同期処理の制御に使えそうだ…

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();

まとめ

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

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

• node 0.12で使えるようになるらしい(node 0.11はES6 draftと実装が異なる)

top related