微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AsyncIterator 突然退出“for await-of”循环

如何解决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 举报,一经查实,本站将立刻删除。