问题描述
我正在尝试构建一个 buffer
支持的 AsyncIterator
以在缓冲区不为空时从缓冲区生成值,如果缓冲区为空则在 await
上生成 Promise
.
class PushGenerator {
constructor() {
this.buffer = []
this.pending = null
}
// push values to iterator. `null` will stop the iterator
push(value) {
if (this.pending) {
this.pending(value)
this.pending = null
return
}
this.buffer.push(value)
}
async *[Symbol.asyncIterator]() {
let event = null
while(true) {
if (this.buffer.length > 0) event = this.buffer.shift()
else event = await new Promise(r => this.pending = r)
if (event !== null) yield event
else break
}
}
}
async function main() {
const gen = new PushGenerator()
setTimeout(() => gen.push(10),10)
for await (const item of gen) {
console.log("---",item)
}
setTimeout(() => gen.push(null),3000)
console.log('Im not called!')
}
main().then(v => console.log('never called',v))
.catch(e => console.log('never called',e))
对于大多数部分它工作正常,除了如果我 push
值 after await for-of
循环,它完全被忽略。事实上,async main
本身在没有解决/拒绝承诺的情况下终止!。我的期望是 for await-of
循环等待值直到循环中断或 null
被发送到 PushGenerator
在 nodejs 和 chrome 中的行为都是相同的。谷歌搜索没有太大帮助,也无法在 SO 中找到任何类似的问题。
我错过了什么?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)