当前位置: 首页 > 后端技术 > Node.js

关于Node.js中的异步迭代器

时间:2023-04-03 10:18:18 Node.js

异步迭代器从10.0.0版本开始出现在Node中,在本文中,我们将讨论异步迭代器的作用以及它们可以在哪里使用。什么是异步迭代器异步迭代器其实就是前面迭代器的异步版本。当我们不知道迭代的值和最终状态时,可以使用异步迭代器。两者的区别在于,我们得到的promise最终会被分解成一个普通的{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;}//处理响应没有响应主体的情况if(!body)resolve({});//需要解析文本以获得json,因为它是一个字符串constresult=JSON.parse(body);resolve(result);}catch(error){reject(error)}});awaitreq;req.end();});}代码向CatAPI(https://thecatapi.com/)获取一些猫的照片。还添加了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(error){console.log(error);}})()这样,我们将每7秒自动获取一整页猫图片在页面之间导航的一种更常见的方法是实现next和previous方法并将它们公开为控件:functionactualCatPics({limit}){return{[Symbol.asyncIterator]:()=>{让页面=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);next().then(console.log);previous().then(console.log);}catch(error){console.log(error);}如您所见,异步迭代器非常有用。这些功能在Chrome63+、Firefox57+、Safari11.1+中可用。您能想到可以使用异步迭代器的任何其他地方吗?欢迎在下方留言!