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
。