【发布时间】:2021-06-06 13:52:02
【问题描述】:
我正在尝试让以下异步生成器工作:
class MyIterator {
constructor(m) {
this.collection = m;
}
async *[Symbol.iterator]() {
for (let item of this.collection) {
const resultItem = await Promise.resolve(item)
console.log("item: ", resultItem)
yield resultItem
}
}
}
(async () => {
const iterator = new MyIterator([1,2,3])
let times = 0
for await (let thing of iterator) {
console.log("thing: ", thing)
// this is here to avoid an infinite loop
times++
if (times > 1000) break
}
})()
但它最终会陷入无限循环,并且thing 始终未定义。
item: 1
thing: undefined
item: 2
thing: undefined
item: 3
thing: undefined (x999)
我尝试了类似的代码,但这次没有 Promise/async 行为,而且它似乎工作得很好。
class MyIterator {
constructor(m) {
this.collection = m;
}
*[Symbol.iterator]() {
for (let item of this.collection) {
console.log("item: ", item)
yield item
}
}
}
const iterator = new MyIterator([1,2,3])
for (let thing of iterator) {
console.log("thing: ", thing)
}
item: 1
thing: 1
item: 2
thing: 2
item: 3
thing: 3
【问题讨论】:
-
尝试使用
then()而不是 await。这样它只会在第一个迭代完成时产生下一个迭代。 -
@zergski 不,这是不正确的。
-
Symbol.iterator->Symbol.asyncIterator?你确实想定义一个异步迭代器,对吧?您已将其标记为常规。 -
就是@VLAZ,我不知道
Symbol.asyncIterator。一旦我从.iterator更改为.asyncIterator,它就全部工作了。也感谢您指出命名法。MyIterator实现了 iterable protocol,而不是迭代器。
标签: javascript ecmascript-6 async-await promise generator