- generator関数(*function)を実行するとgeneratorオブジェクト(以下genobj)を返す
- json(配列)を使った応用ではyield*とfor-ofを使う
// genobjを返す
var hoge = function*() {
console.log('run hoge');
yield "val of hoge"
}
var foo = function*() {
console.log('run foo');
yield "val of foo"
}
yield* でitertableなオブジェクト(genobjやarray)を渡すと、それがdoneになるまでイテレートする https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield*
var gen = (function*() {
yield* hoge();
yield* foo();
}());
for (let val of gen) {
console.log(val); // run hoge, "val of hoge", run foo, "val of foo"
}
上では例えばjsonで渡されたデータを元にルーチンを実行すると言ったことができない。
しかしfor-ofを使えば可能
var jsonData = ["hoge", "hoge", "foo"]
// jsonDataを元にgenObjオンリーの配列をつくる
// 要はtasks = [window.hoge(), window.hoge(), window.foo()]と同じことをする
var tasks = jsonData.map((item)=> {
return window[item]();
})
// メインルーチン作成
var gen = (function*() {
for (let g of tasks) yield* g;
}());
// 以下は一緒
for (let val of gen) {
console.log(val);
}
ちなみにforeachは使えない
コールバックではyieldは呼べないため(async/awaitの関係に似ている)
// Doesn't work
var gen = (function*() {
tasks.forEach(function(g) {
yield* g; // エラー
});
}());
https://sbfl.net/blog/2016/08/17/javascript-iterator-generator/