// 一个定义了迭代行为的对象,比如在 for...of 中循环了哪些值。
// 为了实现可迭代,一个对象必须实现 @iterator 方法,
// 这意味着这个对象(或其原型链中的一个对象)必须具有带 Symbol.iterator 键的属性:
function iterator(){
return {
[Symbol.asyncIterator](){
return{
index : 0,
next(){
return new Promise((resolve,reject)=>{
setTimeout(()=>resolve({value:this.index++,done:false}),1000)
})
}
}
}
}
}
(async function(){
const iter = iterator()
for await(const x of iter){
console.log(x)
}
})()
// 异步生成器已经实现了异步迭代器协议, 所以可以用 for await...of循环。
const task = (i)=>new Promise((resolve,reject)=>setTimeout(()=>resolve(i),1000))
async function *generater(){
let index = 0
while(true){
yield await task(index++)
}
}
(async function(){
const gen = generater()
for await(const x of gen){
console.log(x)
}
})()
console