异步迭代器(asyncIterator)同步迭代器asynchronousiteratorforawait...ofasynchronousgeneratorfunctionyield*statement1.同步迭代器普通的迭代器生成函数被调用后会返回一个迭代器对象,可以去调用下一个方法迭代器。一旦next方法执行完毕,必须同步获取一个状态对象,{value,done}//迭代器生成函数functionmakeIterator(arr){varnextIndex=0;return{next(){returnnextIndexsetTimeout(()=>resolve(arr[nextIndex++]),delay-=1000)),done:false}:{value:undefined,done:true}returnres}}}//调用遍历constarr=[1,2]letiter=makeIterator(arr)iter.next().value.then(val=>console.log(val))//1iter.next().value.then(val=>console.log(val));//2iter.next().value.then(val=>console.log(val));//undefinedthis的method只是让值异步执行,done的值并没有异步生成,执行过程不清楚,语义比较绕过next直接返回一个Promise,使用then链异步处理//Iterator生成函数functionasyncIterator(arr){varnextIndex=0return{[Symbol.asyncIterator](){return{next(){if(nextIndex{setTimeout(()=>resolve({value:arr[nextIndex++],done:false}),1000)})}else{return{value:undefined,done:true}}}}}}//链式执行constasyncIterable=asyncIterator([1,2])常量异步器=asyncIterable[Symbol.asyncIterator]()asyncIter.next().then(val1=>{console.log(val1);returnasyncIter.next()}).then(val2=>{console.log(val2);returnasyncIter.next()}).then(val3=>{console.log(val3);})//{value:1,done:false}//{value:2,done:false}//{value:undefined,done:true}由于asyncIter返回一个Promise,执行可以用异步重写以获得一致的结果asyncfunctionrunner(){constasyncIterable=asyncIterator([1,2])constasyncIter=asyncIterable[Symbol.asyncIterator]()letval1=awaitasyncIter.next()console.log(val1);console.log(awaitasyncIter.next());console.log(awaitasyncIter.next());}3等待。..of根据上面的迭代器生成函数,Symbol.asyncIterator是一个异步迭代器的接口,它返回一个迭代器对象,可以通过forawait...ofasyncfunctionrunner(){forawait(constiofasyncIterator([1,2])){console.log(i);}}runner()//1//2asyncIterator([1,2])返回一个对象,该对象具有异步迭代器接口,可以返回一个异步迭代器对象,用于对该对象进行异步迭代for...of循环自动调用implementer的next方法,得到一个Promise对象await来处理Promise对象。resolve后,将得到的值i传入for...of循环体。如果遍历出错,forawait就会终止。...of,报错,可以把forawait..of放在try中,用catch来捕获错误4.异步生成器函数同步生成器函数会生成一个同步迭代器,然后异步生成器会生成一个异步迭代器在使用Generator函数处理同步和异步操作时,可以使用相同的一组接口功能。异步生成器函数是async和Generator的组合。functionpromise(data,delay){returnnewPromise(resolve=>{setTimeout(()=>{resolve(data)},delay)})}functionprintHello(){returnpromise("Hello",1000)}函数printWorld(){returnpromise("World",1000)}asyncfunction*gene(){yieldprintHello()yieldprintWorld()}letiter=gene()iter.next().then(val=>{控制台。log(val);})//{value:"Hello",done:false}异步生成生成器函数返回一个迭代器对象,调用next方法,返回一个Promise,使用then获取状态对象同步生成器函数返回一个迭代器对象,调用next方法,直接返回state对象,state对象中的值为APromiseusingforawait...of可以异步遍历同步迭代器,只是value是异步的,而done的生成仍然是同步的。asyncfunctionrunner(){forawait(constiofiter){console.log(i);}}runner()不管Generator函数之前是否有async会延迟1000ms打印Hello和Worldawait和yield可以同时出现在异步Generator函数中asyncfunction*readLines(path){letfile=awaitfileOpen(path);try{while(!file.EOF){yieldawait文件。读线();}}最后{awaitfile.close();await之后的操作返回一个Promise对象,将外部操作产生的值输入到函数内部的yield命令中返回一个Promise作为每次下一次暂停的位置,async函数和异步Generator函数都封装了asynchronous操作。异步函数有自己的执行器。异步Generator函数可以通过await...of来遍历函数。它可以分为四类普通函数。TheasyncfunctionGeneratorFunctionasynchronousGeneratorfunction5.yield*语句yield*后面可以跟一个Generator函数,将其语句展开为异步生成器函数*gene1(){yield'a'yield'b'console.log(0);}asyncfunction*gene2(){yield*gene1()yield'c';}asyncfunctionrunner(){forawait(constiofgene2()){console.log(i);}}runner()//"a"//"b"//0//"c"