SOURCE

// 一个定义了迭代行为的对象,比如在 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 命令行工具 X clear

                    
>
console