• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
The Generator of ECMAScript 6th
 

The Generator of ECMAScript 6th

on

  • 912 views

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

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

Statistics

Views

Total Views
912
Views on SlideShare
459
Embed Views
453

Actions

Likes
1
Downloads
0
Comments
0

3 Embeds 453

http://paulownia.hatenablog.com 450
http://feedly.com 2
http://www.feedspot.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    The Generator of ECMAScript 6th The Generator of ECMAScript 6th Presentation Transcript

    • 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 { 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と実装が異なる)