如何解决AsyncIterator 突然退出“for await-of”循环
我正在尝试构建一个 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 举报,一经查实,本站将立刻删除。