在本文中,我们讨论了异步迭代器的作用,并解决了它们可能用于什么目的的问题。什么是异步迭代器那么什么是异步迭代器呢?它们实际上是以前可用的迭代器的异步版本。当我们不知道迭代的值和最终状态时可以使用异步迭代器,并且我们最终得到解析为{value:any,done:boolean}对象的承诺。我们还有for-await-of循??环来帮助我们遍历异步迭代器。就像for-of循??环用于同步迭代器一样。constasyncIterable=[1,2,3];asyncIterable[Symbol.asyncIterator]=asyncfunction*(){for(leti=0;i{constreq=https.get(url,asyncfunction(res){if(res.statusCode>=400){returnreject(newError(`HTTPStatus:${res.statusCode}`));}try{letbody='';/*代替res.on监听流中的数据,我们可以使用for-await-of,并将数据块附加到响应主体的其余部分*/forawait(constchunkofres){body+=chunk;}//处理没有body的情况if(!body)resolve({});//我们需要解析文本以获得json,因为它是一个字符串constresult=JSON.parse(body);resolve(result);}catch(error){reject(error)}});awaitreq;req.end();});}我们将向CatAPI发出请求,以获取一些10只一组的猫的照片。我们将还在请求之间添加7秒的延迟,最大页面计数为5,以避免catAPI过载。我们还将在请求和最大页面数5之间添加7秒的延迟,以避免catAPI过载,因为那将是灾难性的。functionfetchCatPics({limit,page,done}){returnhomebrewFetch(`https://api.thecatapi.com/v1/images/search?limit=${limit}&page=${page}&order=DESC`)。然后(body=>({value:body,done}));}functioncatPics({limit}){return{[Symbol.asyncIterator]:asyncfunction*(){letcurrentPage=0;//在5页后停止while(currentPage<5){try{constcats=awaitfetchCatPics({currentPage,limit,done:false});console.log(`获取了${limit}只猫`);产量猫;当前页面++;}catch(error){console.log('获取所有猫时出错!');控制台日志(错误);}}}};}(asyncfunction(){try{forawait(letcatPicPageofcatPics({limit:10})){console.log(catPicPage);//在请求之间等待7秒awaitnewPromise(resolve=>setTimeout(resolve,7000));}}catch(错误){控制台日志(错误);}})()这样我们就每隔7秒自动抓取一整页的猫图供查看。在页面之间导航的一种更常见的方法是实现next和previous方法并将它们公开为控件:functionactualCatPics({limit}){return{[Symbol.asyncIterator]:()=>{letpage=0;return{next:function(){page++;返回fetchCatPics({page,limit,done:false});},previous:function(){if(page>0){page--;返回fetchCatPics({page,limit,done:false});}returnfetchCatPics({page:0,limit,done:true});}}}};}try{constsomeCatPics=actualCatPics({limit:5});const{下一个,上一个}=someCatPics[Symbol.asyncIterator]();下一个()然后(控制台。日志);next().then(console.log);previous().then(console.log);}catch(error){console.log(error);}如你所见,异步迭代器在你想要获取数据页面或做无限滚动等事情时很有用你的应用程序的用户界面。这些功能已经在浏览器中可用了一段时间,并且在Chromev63+、Firefoxv57+和Safariv11.1中可用。但它目前在IE和Edge中不可用。您对使用异步迭代器有什么新想法吗?你已经在你的程序中使用它们了吗?请在评论中让我知道。