以下の内容はhttps://let.blog.jp/tag/Generatorより取得しました。


ツリー構造の要素をひとつずつ返してくれるジェネレータ
function* treeIter(root) {
yield root
for(const child of root.children || []) {
yield* treeIter(child)
}
}
const tree = {
name: "root",
children: [
{
name: "item1",
children: [
{
name: "11",
children: [
{
name: "111",
children: [],
}
],
},
{
name: "12",
children: [],
},
{
name: "13",
children: [],
}
],
},
{
name: "item2",
children: [
{
name: "21",
children: [],
}
],
},
],
}

Array.from(treeIter(tree), x => x.name)
// ["root", "item1", "11", "111", "12", "13", "item2", "21"]

EventEmitter を Promise や Generator でする
◯ EventEmitter の基本的な使い方

毎秒時刻をコンソールに表示

const emitter = new EventEmitter()
emitter.on("aaa", value => console.log(value))
setInterval(() => emitter.emit("aaa", Date.now()), 2000)

Promise も非同期処理の通知ができるけど一回限り
二回目以降の通知はできず 終了済みの値は保持されて終了してれば待機せず即実行できる

◯ Promise で EventEmitter みたいなことをやってみる

Promise の結果に本来の結果と次の Promise を入れて 結果を受け取ったら次は新しく受け取った Promise の resolve を待機する

const notifyPromise = () => {
let resolve
const promise = new Promise(a => (resolve = a))
const notify = value => {
const r = resolve
const p = new Promise(a => (resolve = a))
r([value, p])
}
return [notify, promise]
}

const [notify, promise] = notifyPromise()
Promise.resolve().then(async () => {
let p = promise
while (true) {
const [value, next] = await p
try {
console.log(value)
} finally {
p = next
}
}
})
setInterval(() => notify(Date.now()), 2000)

await の無限ループにするので then の中でやらないとメインの処理が進まなくなる
Promise の入れ替えなどちょっと面倒

◯ for await of のループを利用する

generator にして Promise を受け取る
for-of を使って Promise の入れ替えを考えなくていいようにする

const f = () => {
let resolve
const wait = () => new Promise(r => (resolve = r))
async function* g() {
while (true) yield await wait()
}
const notify = v => resolve(v)
const it = g()
return [notify, it]
}

const [notify, it] = f()
Promise.resolve().then(async () => {
for await (const value of it) {
console.log(value)
}
})
setInterval(() => notify(Date.now()), 2000)

generator の中で作った関数を公開して その関数の中で yield できたら楽だったけど generator スコープ中でしか yield できない
なので emit に当たる関数が呼び出されるまで待機するには await での待機が必要
async generator にして await で待機してから yield する



以上の内容はhttps://let.blog.jp/tag/Generatorより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14