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


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 する
async generator と for await of
使う目的はわかるけどあまり機会のなかった for await of
async generator を使うとよさそうなことに気づいた
いかにもこれのためにあるって感じがするくらいにマッチしてるけど当たり前の組み合わせだったり?

const wait1Sec = () => new Promise(r => setTimeout(r, 1000))

async function* aGen() {
await wait1Sec()
yield 1
await wait1Sec()
yield 2
await wait1Sec()
yield 3
}

for await (const v of aGen()) {
console.log(v)
}
// 23:36:18.863 1
// 23:36:19.864 2
// 23:36:20.865 3



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

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