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))

对于大多数部分它工作正常,除了如果我 pushafter await for-of 循环,它完全被忽略。事实上,async main 本身在没有解决/拒绝承诺的情况下终止!。我的期望是 for await-of 循环等待值直到循环中断或 null 被发送到 PushGenerator

在 nodejs 和 chrome 中的行为都是相同的。谷歌搜索没有太大帮助,也无法在 SO 中找到任何类似的问题。

我错过了什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)