Quantcast
Channel: すぱぶろ
Viewing all articles
Browse latest Browse all 30

NodeJS と generator

$
0
0

Stream をやっとまともに触り始めたついでに generator も触ってみた。node は v0.11.13 です。

Generators - JavaScript | MDN

*a2zは a から z までを順に yieldに指定しているので、g.next()を呼び出すたびに a からインクリメントされたアルファベットが返される。

function* a2z() {var c = 97;

    while (c <= 'z'.charCodeAt(0)) {
        yield String.fromCharCode(c++);
    }return;
}var g = a2z();
process.stdout.write(g.next().value);
process.stdout.write(g.next().value);
process.stdout.write(g.next().value);

// node --harmony a2z.js// abc

generator と同じく ES6 の for...ofに generator を渡すと最後まで繰り返してくれる。

for...of - JavaScript | MDN

function* a2z() {var c = 97;

    while (c <= 'z'.charCodeAt(0)) {
        yield String.fromCharCode(c++);
    }return;
}for (var a of a2z()) {
    process.stdout.write(g.next().value);
}// node --harmony a2z.js// abcdefghijklmnopqrstuvwxyz

最後に Stream の勉強も兼ねて stream-handbookのサンプルをジェネレータで書いてみた。100 ms ごとに a から z までが出力される。

function* a2z() {var c = 97;

    while (c <= 'z'.charCodeAt(0)) {
        yield String.fromCharCode(c++);
    }return;
}var Readable = require('stream').Readable;
var rs = Readable();
var g = a2z();

rs._read = function () {var that = this;
    setTimeout(function () {
        that.push(g.next().value);
    }, 100);
};

rs.pipe(process.stdout);

// node --harmony a2z.js// abcdefghijklmnopqrstuvwxyz

ちなみに generator の定義方法は function* generatorfunction *generator(アスタリクスの位置が違う)を見かけるが MDN では function*と記載されているのでここではそちらで統一している。


Viewing all articles
Browse latest Browse all 30

Trending Articles