1

iteratorCount以下代码的目的是什么(来自https://deno.land/std@0.64.0/async/mux_async_iterator.ts)?

#iteratorCount = 0
#yields = []
#throws = []
#signal = deferred()

add () {
  ++this.#iteratorCount
  this.#callIteratorNext(iterator)
}

async #callIteratorNext (iterator) {
  try {
    const { value, done } = await iterator.next()
    if (done) {
      --this.#iteratorCount
    } else {
      this.#yields.push({ iterator, value })
    }
  } catch (e) {
    this.#throws.push(e)
  }
  this.#signal.resolve()
}

async *iterate () {
  while (this.#iteratorCount > 0) {
    await this.#signal

    for (let i = 0; i < this.#yields.length; i++) {
      const { iterator, value } = this.#yields[i]
      yield value

      this.#callIteratorNext(iterator)
    }

    if (this.#throws.length) {
      for (const e of this.#throws) {
        throw e
      }
      this.#throws.length = 0
    }

    this.#yields.length = 0
    this.#signal = deferred()
  }
}

据我所知,iteratorCount如果添加到 MuxIterator 的所有迭代器都没有错误,则与此无关。

此外,“在错误处理iteratorCount后不清除”和“循环while (this.iteratorCount > 0)”的概念对我来说似乎很奇怪。

我已经得出结论,这种东西是用于“手动错误处理”,以便通过添加额外的迭代器来使 Mux Async Iterator 进一步迭代。

尽管有这种观点,但我想不出iteratorCount回到零的情况。

我们可以减少计数的唯一方法是callIteratorNext()完成它。但是,我们必须在它之前添加迭代器,这使得计数增加。

所以,我不能得到任何角色iteratorCount

4

0 回答 0